12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- namespace TrafficDll
- {
- public class Traffic
- {
- ///
- /// 凡是在管制区域的等待队列中的AGV都是需要被管制的对象
- /// 被管制区域的主agv
- ///
- private List<TrafficArea> TrafficAreaList = new List<TrafficArea>();
- private List<TrafficArea> UsageTrafficAreaList = new List<TrafficArea>();
- public object UsageTrafficLock = new object();
- public AGV_WPF.MainWindow.AGVStatus_TypStr[] agvArray;
- public AGV_WPF.MainWindow.AGVStatus_TypStr[] agvArrayOlde;
- public Thread TrafficThread=null;
- public Traffic()
- {
- // AGVStatus
- agvArrayOlde = new AGV_WPF.MainWindow.AGVStatus_TypStr[] { };
- TrafficAreaList = new List<TrafficArea>();
- UsageTrafficAreaList = new List<TrafficArea>();
- TrafficAreaInit();
-
- // TrafficThread = new Thread(new ParameterizedThreadStart(CheckStatus));
-
- }
- public Traffic(AGV_WPF.MainWindow.AGVStatus_TypStr[] agvArrayNew)
- {
- agvArray = agvArrayNew;
- TrafficAreaList = new List<TrafficArea>();
- UsageTrafficAreaList = new List<TrafficArea>();
- agvArrayOlde = new AGV_WPF.MainWindow.AGVStatus_TypStr[] { };
- TrafficAreaInit();
- // TrafficThread = new Thread(new ParameterizedThreadStart(CheckStatus));
- }
- private void TrafficAreaInit()
- {
- DAL.ZSql sql1 = new DAL.ZSql();
- //地标功能定义
- sql1.Open("select * from T_TrafficNew");
- if (sql1.rowcount > 0)
- {
- for (int i = 0; i < sql1.rowcount; i++)
- {
- TrafficArea trafficArea = new TrafficArea();
- trafficArea.Number =Convert.ToInt32( sql1.Rows[i][0]);
- string[] pointAllArrStr = Convert.ToString(sql1.Rows[i][1]).Split(',');
- string[] pointInsideArrStr = Convert.ToString(sql1.Rows[i][2]).Split(',');
- string[] pointOutSideArrStr = Convert.ToString(sql1.Rows[i][3]).Split(',');
- byte type = Convert.ToByte(sql1.Rows[i][4]);
- trafficArea.PointArr = ToIntArray(pointAllArrStr);
- trafficArea.PointArrInside = ToIntArray(pointInsideArrStr);
- trafficArea.PointArrOut = ToIntArray(pointOutSideArrStr);
- trafficArea.TypeTraffic = type;
- TrafficAreaList.Add(trafficArea);
- }
- sql1.Close();
- }
- else
- {
- // MessageBox.Show("Warning: please set in the 'Settings' landmark function!");
- }
- }
- // private void CheckStatus(object agvArray)
- public void CheckStatus()
- {
- agvArrayOlde = new AGV_WPF.MainWindow.AGVStatus_TypStr[agvArray.Count()];
- while (true)
- {
- //赋值
- // if (agvArrayOlde.Count() == 0 && agvArray.Count() > 0)
- {
-
- for (int i = 0; i < agvArray.Count(); i++)
- {
- agvArrayOlde[i].AgvNum = agvArray[i].AgvNum;
- agvArrayOlde[i].Current = agvArray[i].Current;
- agvArrayOlde[i].Direction = agvArray[i].Direction;
- agvArrayOlde[i].LineNum = agvArray[i].LineNum;
- agvArrayOlde[i].MarkFunction = agvArray[i].MarkFunction;
- agvArrayOlde[i].MarkNum = agvArray[i].MarkNum;
- agvArrayOlde[i].Speed = agvArray[i].Speed;
- agvArrayOlde[i].Status = agvArray[i].Status;
- agvArrayOlde[i].TrafficNum = agvArray[i].TrafficNum;
- agvArrayOlde[i].Voltage = agvArray[i].Voltage;
- agvArrayOlde[i].Wlink_Count = agvArray[i].Wlink_Count;
- agvArrayOlde[i].WlLink = agvArray[i].WlLink;
- agvArrayOlde[i].WorkLine = agvArray[i].WorkLine;
- }
- }
- TrafficManager3();
- #region
-
- #endregion
- Thread.Sleep(20);
- }
- }
- private void TrafficManager(AGV_WPF.MainWindow.AGVStatus_TypStr agv) //写入AGV的卡号和状态改变的事件中最好
- {
- // for(int i=0;i<)
- bool flag1 = false;
- bool flag2 = false;
- #region
- if (UsageTrafficAreaList.Count > 0)
- {
- for (int n = 0; n < UsageTrafficAreaList.Count; n++)
- {
- #region
- if (UsageTrafficAreaList[n].OccupyAgv.AgvNum == agv.AgvNum)
- {
-
- //判断agv是否出了区域
- if (!UsageTrafficAreaList[n].PointArr.Contains(agv.MarkNum))
- {
- //出了管制区域
- if (UsageTrafficAreaList[n].WaitAgv.Count() > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = EqualAgv(UsageTrafficAreaList[n].WaitAgv[0]);
- UsageTrafficAreaList[n].OccupyAgv = agv1;
- UsageTrafficAreaList[n].WaitAgv.RemoveAt(0);
- continue;
- }
- else
- {
- UsageTrafficAreaList.RemoveAt(n);
- n = - 1;
- }
- }
- else
- {
-
- }
- }
- else if (UsageTrafficAreaList[n].WaitAgv.Count > 0)
- {
- foreach (AGV_WPF.MainWindow.AGVStatus_TypStr agv1 in UsageTrafficAreaList[n].WaitAgv)
- {
- if (agv1.AgvNum == agv.AgvNum)
- {
- if (!UsageTrafficAreaList[n].PointArr.Contains(agv.MarkNum))
- {
- UsageTrafficAreaList[n].WaitAgv.Remove(agv1);
- break;
- }
- }
- }
- }
- #endregion
- }
- }
- #endregion
- #region
- if (TrafficAreaList.Count > 0)
- {
- for (int i = 0; i < TrafficAreaList.Count; i++)
- {
- # region
- if (TrafficAreaList[i].PointArr.Contains(agv.MarkNum))
- //如果AGV的当前卡号在某个管制区域内
- {
- //判断该管制区域是否在激活的管制区域中
- if (UsageTrafficAreaList.Count == 0)
- {
- //将该区域赋值给另一个区域再添加进激活的列表中
- UsageTrafficAreaList.Add(Equal(TrafficAreaList[i]));
- UsageTrafficAreaList[0].OccupyAgv = EqualAgv(agv);
- }
- #region
- else if (UsageTrafficAreaList.Count > 0)
- {
- for (int m = 0; m < UsageTrafficAreaList.Count; m++)
- {
- //如果当前的管制区域已经是激活的
- if (UsageTrafficAreaList[m].Number == TrafficAreaList[i].Number)
- {
- flag1 = true;
- //判断该激活的管制区域中的AGV数量、编号及主AGV的状态
- if (UsageTrafficAreaList[m].OccupyAgv.AgvNum == agv.AgvNum)
- {
- // flag2 = true;
- //判断该激活的管制区域中的AGV数量、编号及主AGV的状态
- //还在管制区域内 状态为停止时 //0x40运行,0x41暂停,0x42结束地标停止,0x40前的都为报警,0x43停止,0x44当作充电
- if (agv.Status == 0x40)
- {
- continue;
- }
- else if (agv.Status < 0x40)
- {
- //if (UsageTrafficAreaList[m].PointArrOut.Contains(agv.MarkNum))
- //{
-
- //}
- continue;
- }
- else if (agv.Status > 0x40)
- {
- //判断agv当前点是不是中心点,如果 不是则切换管制区域内主机
- if (UsageTrafficAreaList[m].PointArrOut.Contains(agv.AgvNum)&& UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[0]);
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(0);
- continue;
- }
- }
- }
- else
- {
- if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- for (int t = 0; t < UsageTrafficAreaList[m].WaitAgv.Count; t++)
- {
- if (UsageTrafficAreaList[m].WaitAgv[t].AgvNum == agv.AgvNum)
- {
- flag2 = true;
- if (agv.Status == 0x40)
- {
- //本应该被管制但是没有被管制
- //边缘区域且下一点不是管制区域内,则取消管制
- continue;
- }
- else if (agv.Status > 0x40)
- {
- //在数组中删除该AGV
- continue;
- }
- }
- }
- if (!flag2)
- {
- // UsageTrafficAreaList[m].WaitAgv.Add(agv);
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- }
- else //等待区域没有AGV
- {
- // UsageTrafficAreaList[m].WaitAgv.Add(agv);
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- }
- }
- }
- if (!flag1) //表示agv所读的卡的区域再管制区域内,但是不在被激活的管制区域内
- {
- TrafficArea trafficNew = Equal(TrafficAreaList[i]);
- trafficNew.OccupyAgv = EqualAgv(agv);
- UsageTrafficAreaList.Add(Equal(trafficNew));
- flag1 = false;
- }
- }
- #endregion
- }
- #endregion
-
-
- }
- }
-
- #endregion
-
- }
- private void TrafficManager1() //写入AGV的卡号和状态改变的事件中最好
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv;
- lock (UsageTrafficLock)
- {
- for (int tt = 0; tt < agvArrayOlde.Count(); tt++)
- {
- agv = agvArrayOlde[tt];
- bool flag1 = false;
- bool flag2 = false;
- #region
- if (UsageTrafficAreaList.Count > 0)
- {
- for (int n = 0; n < UsageTrafficAreaList.Count; n++)
- {
- #region
- if (UsageTrafficAreaList[n].OccupyAgv.AgvNum == agv.AgvNum)
- {
- //判断车辆是否在线,如果不在线则删除
- if (agv.WlLink == false)
- {
- //出了管制区域
- if (UsageTrafficAreaList[n].WaitAgv.Count() > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = EqualAgv(UsageTrafficAreaList[n].WaitAgv[0]);
- UsageTrafficAreaList[n].OccupyAgv = agv1;
- UsageTrafficAreaList[n].WaitAgv.RemoveAt(0);
- break;
- }
- else
- {
- UsageTrafficAreaList.RemoveAt(n);
- n = -1;
- break;
- }
- }
- //判断agv是否出了区域
- if (!UsageTrafficAreaList[n].PointArr.Contains(agv.MarkNum))
- {
- //出了管制区域
- if (UsageTrafficAreaList[n].WaitAgv.Count() > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = EqualAgv(UsageTrafficAreaList[n].WaitAgv[0]);
- UsageTrafficAreaList[n].OccupyAgv = agv1;
- UsageTrafficAreaList[n].WaitAgv.RemoveAt(0);
- continue;
- }
- else
- {
- UsageTrafficAreaList.RemoveAt(n);
- n = -1;
- }
- }
- else
- {
- }
- }
- else if (UsageTrafficAreaList[n].WaitAgv.Count > 0)
- {
- foreach (AGV_WPF.MainWindow.AGVStatus_TypStr agv1 in UsageTrafficAreaList[n].WaitAgv)
- {
- if (agv1.AgvNum == agv.AgvNum)
- {
- if (!UsageTrafficAreaList[n].PointArr.Contains(agv.MarkNum))
- {
- UsageTrafficAreaList[n].WaitAgv.Remove(agv1);
- break;
- }
- }
- }
- }
- #endregion
- }
- }
- #endregion
- #region
- if (TrafficAreaList.Count > 0)
- {
- for (int i = 0; i < TrafficAreaList.Count; i++)
- {
- # region
- if (TrafficAreaList[i].PointArr.Contains(agv.MarkNum))
- //如果AGV的当前卡号在某个管制区域内
- {
- //判断该管制区域是否在激活的管制区域中
- if (UsageTrafficAreaList.Count == 0)
- {
- //将该区域赋值给另一个区域再添加进激活的列表中
- UsageTrafficAreaList.Add(Equal(TrafficAreaList[i]));
- UsageTrafficAreaList[0].OccupyAgv = EqualAgv(agv);
- }
- #region
- else if (UsageTrafficAreaList.Count > 0)
- {
- for (int m = 0; m < UsageTrafficAreaList.Count; m++)
- {
- //如果当前的管制区域已经是激活的
- if (UsageTrafficAreaList[m].Number == TrafficAreaList[i].Number)
- {
- flag1 = true;
- //判断该激活的管制区域中的AGV数量、编号及主AGV的状态
- //防止出现自己管自己
- if (UsageTrafficAreaList[m].OccupyAgv.AgvNum == agv.AgvNum)
- {
- if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- for (int ii = 0; ii < UsageTrafficAreaList[m].WaitAgv.Count; ii++)
- {
- if (UsageTrafficAreaList[m].WaitAgv[ii].AgvNum == UsageTrafficAreaList[m].OccupyAgv.AgvNum)
- {
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(ii);
- }
- }
- }
- // for()
- // flag2 = true;
- //判断该激活的管制区域中的AGV数量、编号及主AGV的状态
- //还在管制区域内 状态为停止时 //0x40运行,0x41暂停,0x42结束地标停止,0x40前的都为报警,0x43停止,0x44当作充电
- if (agv.Status == 0x40)
- {
- if (UsageTrafficAreaList[m].PointArrOut.Contains(agv.MarkNum))
- {
- if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- for (int ii = 0; ii < UsageTrafficAreaList[m].WaitAgv.Count; ii++)
- {
- if (UsageTrafficAreaList[m].PointArrInside.Contains(UsageTrafficAreaList[m].WaitAgv[ii].MarkNum))
- {
- //切换主机
- // UsageTrafficAreaList[m].WaitAgv.Add();
- AGV_WPF.MainWindow.AGVStatus_TypStr agvC =new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvC = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[ii]);
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(0);
- UsageTrafficAreaList[m].WaitAgv.Add(agvC);
- break;
- }
- }
- }
- }
- continue;
- }
- else if (agv.Status < 0x40)
- {
-
- continue;
- }
- else if (agv.Status > 0x40)
- {
- //判断agv当前点是不是中心点,如果 不是则切换管制区域内主机
- if (UsageTrafficAreaList[m].PointArrOut.Contains(agv.MarkNum) && UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[0]);
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(0);
- continue;
- }
- }
- }
- else
- {
- if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- for (int t = 0; t < UsageTrafficAreaList[m].WaitAgv.Count; t++)
- {
- if (UsageTrafficAreaList[m].WaitAgv[t].AgvNum == agv.AgvNum)
- {
- flag2 = true;
- if (agv.Status == 0x40)
- {
- //本应该被管制但是没有被管制
- //边缘区域且下一点不是管制区域内,则取消管制
- continue;
- }
- else if (agv.Status > 0x40)
- {
- //在数组中删除该AGV
- continue;
- }
- }
- }
- if (!flag2)
- {
- // UsageTrafficAreaList[m].WaitAgv.Add(agv);
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- }
- else //等待区域没有AGV
- {
- // UsageTrafficAreaList[m].WaitAgv.Add(agv);
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- }
- }
- }
- if (!flag1) //表示agv所读的卡的区域再管制区域内,但是不在被激活的管制区域内
- {
- TrafficArea trafficNew = Equal(TrafficAreaList[i]);
- trafficNew.OccupyAgv = EqualAgv(agv);
- UsageTrafficAreaList.Add(Equal(trafficNew));
- flag1 = false;
- }
- }
- #endregion
- }
- #endregion
- }
- }
- #endregion
- }
- }
- }
- private void TrafficManager2() //写入AGV的卡号和状态改变的事件中最好 ,2.25添加方向
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv;
- lock (UsageTrafficLock)
- {
- for (int tt = 0; tt < agvArrayOlde.Count(); tt++)
- {
- agv = agvArrayOlde[tt];
- bool flag1 = false;
- bool flag2 = false;
- #region
- if (UsageTrafficAreaList.Count > 0)
- {
- for (int n = 0; n < UsageTrafficAreaList.Count; n++)
- {
- if (UsageTrafficAreaList[n].OccupyAgv.AgvNum == 0)
- {
- if (UsageTrafficAreaList[n].WaitAgv.Count > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = EqualAgv(UsageTrafficAreaList[n].WaitAgv[0]);
- UsageTrafficAreaList[n].OccupyAgv = agv1;
- UsageTrafficAreaList[n].WaitAgv.RemoveAt(0);
- continue;
- }
- else
- {
- UsageTrafficAreaList.RemoveAt(n);
- n = -1;
- continue;
- }
- }
- #region
- if (UsageTrafficAreaList[n].OccupyAgv.AgvNum == agv.AgvNum)
- {
-
- //判断车辆是否在线,如果不在线则删除
- if (agv.WlLink == false)
- {
- //出了管制区域
- if (UsageTrafficAreaList[n].WaitAgv.Count() > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = EqualAgv(UsageTrafficAreaList[n].WaitAgv[0]);
- UsageTrafficAreaList[n].OccupyAgv = agv1;
- UsageTrafficAreaList[n].WaitAgv.RemoveAt(0);
- continue;
- }
- else
- {
- UsageTrafficAreaList.RemoveAt(n);
- n = -1;
- continue;
- }
- }
- //判断agv是否出了区域
- if (!UsageTrafficAreaList[n].PointArr.Contains(agv.MarkNum))
- {
- //出了管制区域
- if (UsageTrafficAreaList[n].WaitAgv.Count() > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = EqualAgv(UsageTrafficAreaList[n].WaitAgv[0]);
- UsageTrafficAreaList[n].OccupyAgv = agv1;
- UsageTrafficAreaList[n].WaitAgv.RemoveAt(0);
- continue;
- }
- else
- {
- UsageTrafficAreaList.RemoveAt(n);
- n = -1;
- continue;
- }
- }
- else
- {
- }
- }
- else if (UsageTrafficAreaList[n].WaitAgv.Count > 0)
- {
- foreach (AGV_WPF.MainWindow.AGVStatus_TypStr agv1 in UsageTrafficAreaList[n].WaitAgv)
- {
- if (agv1.AgvNum == agv.AgvNum)
- {
- if (!UsageTrafficAreaList[n].PointArr.Contains(agv.MarkNum))
- {
- UsageTrafficAreaList[n].WaitAgv.Remove(agv1);
- break;
- }
- }
- }
- }
- #endregion
- }
- }
- #endregion
- #region
- if (TrafficAreaList.Count > 0)
- {
- for (int i = 0; i < TrafficAreaList.Count; i++)
- {
-
- if (TrafficAreaList[i].PointArr.Contains(agv.MarkNum))
- //如果AGV的当前卡号在某个管制区域内
- {
- # region
- //判断该管制区域是否在激活的管制区域中
- if (UsageTrafficAreaList.Count == 0)
- {
- //将该区域赋值给另一个区域再添加进激活的列表中
- UsageTrafficAreaList.Add(Equal(TrafficAreaList[i]));
- UsageTrafficAreaList[0].OccupyAgv = EqualAgv(agv);
- }
-
- else if (UsageTrafficAreaList.Count > 0)
- {
- flag1 = false;
- #region
- for (int m = 0; m < UsageTrafficAreaList.Count; m++)
- {
- //如果当前的管制区域已经是激活的
- if (UsageTrafficAreaList[m].Number == TrafficAreaList[i].Number)
- {
- flag1 = true;
- //判断该激活的管制区域中的AGV数量、编号及主AGV的状态
- //防止出现自己管自己
-
- if (UsageTrafficAreaList[m].OccupyAgv.AgvNum == agv.AgvNum)
- {
- #region
- if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- for (int ii = 0; ii < UsageTrafficAreaList[m].WaitAgv.Count; ii++)
- {
- if (UsageTrafficAreaList[m].WaitAgv[ii].AgvNum == UsageTrafficAreaList[m].OccupyAgv.AgvNum)
- {
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(ii);
- }
- }
- }
- // for()
- // flag2 = true;
- //判断该激活的管制区域中的AGV数量、编号及主AGV的状态
- //还在管制区域内 状态为停止时 //0x40运行,0x41暂停,0x42结束地标停止,0x40前的都为报警,0x43停止,0x44当作充电
- if (agv.Status == 0x40)
- {
-
- continue;
- }
- else if (agv.Status < 0x40)
- {
- continue;
- }
- else if (agv.Status == 0x42||agv.Status==0x43||agv.Status==0x44)
- {
- //判断agv当前点是不是中心点,如果 不是则切换管制区域内主机
- if (UsageTrafficAreaList[m].PointArrOut.Contains(agv.MarkNum) && UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- //UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[0]);
- //UsageTrafficAreaList[m].WaitAgv.RemoveAt(0);
- AGV_WPF.MainWindow.AGVStatus_TypStr agvC = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvC = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[0]);
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(0);
- // UsageTrafficAreaList[m].WaitAgv.Add
- UsageTrafficAreaList[m].WaitAgv.Add(agvC);
- continue;
- }
- }
- else if (agv.Status == 0x41)
- {
- //判断agv当前点是不是中心点,如果 不是则切换管制区域内主机
- if (UsageTrafficAreaList[m].PointArrOut.Contains(agv.MarkNum) && UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- for (int jjj = 0; jjj < UsageTrafficAreaList[m].WaitAgv.Count; jjj++)
- {
- if (!UsageTrafficAreaList[m].PointArrOut.Contains(UsageTrafficAreaList[m].WaitAgv[jjj].MarkNum)
- && UsageTrafficAreaList[m].TypeTraffic!=4)
- {
- //UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[0]);
- //UsageTrafficAreaList[m].WaitAgv.RemoveAt(0);
- AGV_WPF.MainWindow.AGVStatus_TypStr agvC = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvC = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[jjj]);
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(jjj);
- // UsageTrafficAreaList[m].WaitAgv.Add
- UsageTrafficAreaList[m].WaitAgv.Add(agvC);
- break;
- }
- }
- }
- }
- #endregion
- }
- else
- {
- if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- #region
- for (int t = 0; t < UsageTrafficAreaList[m].WaitAgv.Count; t++)
- {
- if (UsageTrafficAreaList[m].WaitAgv[t].AgvNum == agv.AgvNum)
- {
- flag2 = true;
- continue;
- }
- }
- if (!flag2)
- {
- if (UsageTrafficAreaList[m].TypeTraffic == 1)
- {
- if(agv.Direction==0)
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- else if (UsageTrafficAreaList[m].TypeTraffic == 2)
- {
- if (agv.Direction == 1)
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- else
- {
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- flag2 = false;
- }
- #endregion
- }
- else //等待区域没有AGV
- {
- #region
- // UsageTrafficAreaList[m].WaitAgv.Add(agv);
- //AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- if (UsageTrafficAreaList[m].TypeTraffic == 1)
- {
- if (agv.Direction == 0)
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- else if (UsageTrafficAreaList[m].TypeTraffic == 2)
- {
- if (agv.Direction == 1)
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- else
- {
- AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- }
- #endregion
- }
- }
- }
- }
- if (!flag1) //表示agv所读的卡的区域再管制区域内,但是不在被激活的管制区域内
- {
- TrafficArea trafficNew = Equal(TrafficAreaList[i]);
- trafficNew.OccupyAgv = EqualAgv(agv);
- UsageTrafficAreaList.Add(Equal(trafficNew));
- flag1 = false;
- }
- #endregion
- }
- #endregion
- }
- }
- }
- #endregion
- }
- }
- }
- private void TrafficManager3() //写入AGV的卡号和状态改变的事件中最好 ,2.25添加方向 去掉防止出现后管前去掉掉线删除agv
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv;
- lock (UsageTrafficLock)
- {
- for (int tt = 0; tt < agvArrayOlde.Count(); tt++)
- {
- agv = agvArrayOlde[tt];
- bool flag1 = false;
- bool flag2 = false;
- #region 不断的轮询已经激活的管制区
- if (UsageTrafficAreaList.Count > 0)
- {
- for (int n = 0; n < UsageTrafficAreaList.Count; n++)
- {
- if (UsageTrafficAreaList[n].OccupyAgv.AgvNum == 0)
- {
- #region 没有主机时更换主机
- if (UsageTrafficAreaList[n].WaitAgv.Count > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = EqualAgv(UsageTrafficAreaList[n].WaitAgv[0]);
- UsageTrafficAreaList[n].OccupyAgv = agv1;
- UsageTrafficAreaList[n].WaitAgv.RemoveAt(0);
- continue;
- }
- else
- {
- UsageTrafficAreaList.RemoveAt(n);
- n = -1;
- continue;
- }
- #endregion
- }
- #region
- else if (UsageTrafficAreaList[n].OccupyAgv.AgvNum == agv.AgvNum)//是该激活区域的主机
- {
- #region 判断agv是否出了区域
- if (!UsageTrafficAreaList[n].PointArr.Contains(agv.MarkNum))//
- {
- //出了管制区域
- #region 主机出了激活的管制区,从等待列表中更换主机
- if (UsageTrafficAreaList[n].WaitAgv.Count() > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = EqualAgv(UsageTrafficAreaList[n].WaitAgv[0]);
- UsageTrafficAreaList[n].OccupyAgv = agv1;
- UsageTrafficAreaList[n].WaitAgv.RemoveAt(0);
- continue;
- }
- else
- {
- UsageTrafficAreaList.RemoveAt(n);
- n = -1;
- continue;
- }
- #endregion
- }
- else
- {
- }
- #endregion
- }
- else if (UsageTrafficAreaList[n].WaitAgv.Count > 0)
- {
- #region 以防出了激活管制区,但是还在等待列表中的agv
- foreach (AGV_WPF.MainWindow.AGVStatus_TypStr agv1 in UsageTrafficAreaList[n].WaitAgv)
- {
- if (agv1.AgvNum == agv.AgvNum)
- {
- if (!UsageTrafficAreaList[n].PointArr.Contains(agv.MarkNum))
- {
- UsageTrafficAreaList[n].WaitAgv.Remove(agv1);
- break;
- }
- }
- }
- #endregion
- }
- #endregion
- }
- }
- #endregion
- #region 遍历所有管制区,更新管制区的状态
- if (TrafficAreaList.Count > 0)
- {
- for (int i = 0; i < TrafficAreaList.Count; i++)
- {
- if (TrafficAreaList[i].PointArr.Contains(agv.MarkNum)) //如果AGV的当前卡号在某个管制区域内
- {
- # region
- //判断该管制区域是否在激活的管制区域中
- if (UsageTrafficAreaList.Count == 0)
- {
- #region 如果地标在管制区列表内,且没有激活的管制区,直接加进来。
- UsageTrafficAreaList.Add(Equal(TrafficAreaList[i]));
- UsageTrafficAreaList[0].OccupyAgv = EqualAgv(agv);
- #endregion
- }
- else if (UsageTrafficAreaList.Count > 0)
- {
- flag1 = false;
- #region
- for (int m = 0; m < UsageTrafficAreaList.Count; m++)
- {
- //如果当前的管制区域已经是激活的
- if (UsageTrafficAreaList[m].Number == TrafficAreaList[i].Number)
- {
- flag1 = true;
- //判断该激活的管制区域中的AGV数量、编号及主AGV的状态
- //防止出现自己管自己
- if (UsageTrafficAreaList[m].OccupyAgv.AgvNum == agv.AgvNum)
- {
- #region 等待列表中有主机
- if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- #region 等待列表中有主机,出现自己管制自己则处理
- for (int ii = 0; ii < UsageTrafficAreaList[m].WaitAgv.Count; ii++)
- {
- if (UsageTrafficAreaList[m].WaitAgv[ii].AgvNum == UsageTrafficAreaList[m].OccupyAgv.AgvNum)
- {
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(ii);
- }
- }
- #endregion
- #region 添加类型5 该类型的作用是防止出现后管前 pointIn 里靠前的点的权限高 能管制后面的点 而后面的点不能管制前面的点
- if (UsageTrafficAreaList[m].TypeTraffic == 5)
- {
- int occupyNum = 0xffff;
- for (int iii = 0; iii < UsageTrafficAreaList[m].PointArrInside.Count(); iii++)
- {
- if (UsageTrafficAreaList[m].PointArrInside[iii] == UsageTrafficAreaList[m].OccupyAgv.MarkNum)
- {
- occupyNum = iii;
- break;
- }
- }
- for (int ii = 0; ii < UsageTrafficAreaList[m].WaitAgv.Count; ii++)
- {
- if (UsageTrafficAreaList[m].PointArrInside.Contains(UsageTrafficAreaList[m].WaitAgv[ii].MarkNum)
- && UsageTrafficAreaList[m].PointArrInside.Contains(UsageTrafficAreaList[m].OccupyAgv.MarkNum))
- {
-
- int waitNum = 0xffff;
- for (int iii = 0; iii < UsageTrafficAreaList[m].PointArrInside.Count(); iii++)
- {
- if (UsageTrafficAreaList[m].PointArrInside[iii] == UsageTrafficAreaList[m].WaitAgv[ii].MarkNum)
- {
- waitNum=iii;
- break;
- }
-
- }
- if (occupyNum > waitNum && occupyNum != 0xffff && waitNum != 0xffff)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agvC = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvC = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[ii]);
- UsageTrafficAreaList[m].WaitAgv.RemoveAt(ii);
- UsageTrafficAreaList[m].WaitAgv.Add(agvC);
- break;
- }
- }
- }
- }
- #endregion
- }
- // for()
- // flag2 = true;
- //判断该激活的管制区域中的AGV数量、编号及主AGV的状态
- //还在管制区域内 状态为停止时 //0x40运行,0x41暂停,0x42结束地标停止,0x40前的都为报警,0x43停止,0x44当作充电
- if (agv.Status == 0x40)
- {
- continue;
- }
- else if (agv.Status < 0x40)
- {
- continue;
- }
- //else if (agv.Status == 0x42 || agv.Status == 0x43 || agv.Status == 0x44)
- //{
- // #region 判断agv当前点是不是中心点,如果 不是则切换管制区域内主机
- // if (UsageTrafficAreaList[m].PointArrOut.Contains(agv.MarkNum) && UsageTrafficAreaList[m].WaitAgv.Count > 0)
- // {
- // AGV_WPF.MainWindow.AGVStatus_TypStr agvC = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- // agvC = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- // UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[0]);
- // UsageTrafficAreaList[m].WaitAgv.RemoveAt(0);
- // UsageTrafficAreaList[m].WaitAgv.Add(agvC);
- // continue;
- // }
- // #endregion
- //}
- //else if (agv.Status == 0x41)
- //{
- // #region 判断agv当前点是不是中心点,如果 不是则切换管制区域内主机
- // if (UsageTrafficAreaList[m].PointArrOut.Contains(agv.MarkNum) && UsageTrafficAreaList[m].WaitAgv.Count > 0)
- // {
- // for (int jjj = 0; jjj < UsageTrafficAreaList[m].WaitAgv.Count; jjj++)
- // {
- // if (!UsageTrafficAreaList[m].PointArrOut.Contains(UsageTrafficAreaList[m].WaitAgv[jjj].MarkNum)
- // && UsageTrafficAreaList[m].TypeTraffic != 4)
- // {
- // AGV_WPF.MainWindow.AGVStatus_TypStr agvC = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- // agvC = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- // UsageTrafficAreaList[m].OccupyAgv = EqualAgv(UsageTrafficAreaList[m].WaitAgv[jjj]);
- // UsageTrafficAreaList[m].WaitAgv.RemoveAt(jjj);
- // UsageTrafficAreaList[m].WaitAgv.Add(agvC);
- // break;
- // }
- // }
- // }
- // #endregion
- //}
- #endregion
- }
- else// 不是主机
- {
- #region
- if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- #region 等待区域里有AGV
- for (int t = 0; t < UsageTrafficAreaList[m].WaitAgv.Count; t++)
- {
- if (UsageTrafficAreaList[m].WaitAgv[t].AgvNum == agv.AgvNum)
- {
- flag2 = true;
- break ;
- }
- }
- if (!flag2)//当前agv不在该激活管制区的等待列表内
- {
- #region 当前agv不在该激活管制区的等待列表内
- if (UsageTrafficAreaList[m].TypeTraffic == 1)
- {
- //if (agv.Direction == 0)
- {
- if (AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv) == 2)
- {
- //切换管制区域
- #region
- AGV_WPF.MainWindow.AGVStatus_TypStr agvM = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvM = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(agv);
- if (UsageTrafficAreaList[m].WaitAgv.Count == 0)
- {
- UsageTrafficAreaList[m].WaitAgv.Add(agvM);
- }
- else if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agvn = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- UsageTrafficAreaList[m].WaitAgv.Add(agvn);
- if (UsageTrafficAreaList[m].WaitAgv.Count > 1)
- {
- for (int jjj = UsageTrafficAreaList[m].WaitAgv.Count - 2; jjj >= 0; jjj--)
- {
- UsageTrafficAreaList[m].WaitAgv[jjj + 1] = EqualAgv(UsageTrafficAreaList[m].WaitAgv[jjj]);
- }
- UsageTrafficAreaList[m].WaitAgv[0] = EqualAgv(agvM);
- }
- }
- #endregion
- }
- }
- }
- else if (UsageTrafficAreaList[m].TypeTraffic == 2)
- {
- if (agv.Direction == 1)
- {
- if (AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv) == 2)
- {
- //切换管制区域
- #region
- AGV_WPF.MainWindow.AGVStatus_TypStr agvM = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvM = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(agv);
- if (UsageTrafficAreaList[m].WaitAgv.Count == 0)
- {
- UsageTrafficAreaList[m].WaitAgv.Add(agvM);
- }
- else if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agvn = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- UsageTrafficAreaList[m].WaitAgv.Add(agvn);
- if (UsageTrafficAreaList[m].WaitAgv.Count > 1)
- {
- for (int jjj = UsageTrafficAreaList[m].WaitAgv.Count - 2; jjj >= 0; jjj--)
- {
- UsageTrafficAreaList[m].WaitAgv[jjj + 1] = EqualAgv(UsageTrafficAreaList[m].WaitAgv[jjj]);
- }
- UsageTrafficAreaList[m].WaitAgv[0] = EqualAgv(agvM);
- }
- }
- #endregion
- }
- }
- }
- else
- {
- if (AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv) == 2)
- {
- //切换管制区域
- #region
- AGV_WPF.MainWindow.AGVStatus_TypStr agvM = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvM = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(agv);
- if (UsageTrafficAreaList[m].WaitAgv.Count == 0)
- {
- UsageTrafficAreaList[m].WaitAgv.Add(agvM);
- }
- else if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agvn = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- UsageTrafficAreaList[m].WaitAgv.Add(agvn);
- if (UsageTrafficAreaList[m].WaitAgv.Count > 1)
- {
- for (int jjj = UsageTrafficAreaList[m].WaitAgv.Count - 2; jjj >= 0; jjj--)
- {
- UsageTrafficAreaList[m].WaitAgv[jjj + 1] = EqualAgv(UsageTrafficAreaList[m].WaitAgv[jjj]);
- }
- UsageTrafficAreaList[m].WaitAgv[0] = EqualAgv(agvM);
- }
- }
- #endregion
- }
- }
- flag2 = false;
- #endregion
- }
- #endregion
- }
- else //等待区域没有AGV
- {
- #region
- // UsageTrafficAreaList[m].WaitAgv.Add(agv);
- //AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv);
- if (UsageTrafficAreaList[m].TypeTraffic == 1)
- {
- //if (agv.Direction == 0)
- {
- if (AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv) == 2)
- {
- //切换管制区域
- #region
- AGV_WPF.MainWindow.AGVStatus_TypStr agvM = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvM = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(agv);
- if (UsageTrafficAreaList[m].WaitAgv.Count == 0)
- {
- UsageTrafficAreaList[m].WaitAgv.Add(agvM);
- }
- else if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agvn = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- UsageTrafficAreaList[m].WaitAgv.Add(agvn);
- if (UsageTrafficAreaList[m].WaitAgv.Count > 1)
- {
- for (int jjj = UsageTrafficAreaList[m].WaitAgv.Count - 2; jjj >= 0; jjj--)
- {
- UsageTrafficAreaList[m].WaitAgv[jjj + 1] = EqualAgv(UsageTrafficAreaList[m].WaitAgv[jjj]);
- }
- UsageTrafficAreaList[m].WaitAgv[0] = EqualAgv(agvM);
- }
- }
- #endregion
- }
- }
- }
- else if (UsageTrafficAreaList[m].TypeTraffic == 2)
- {
- if (agv.Direction == 1)
- {
- if (AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv) == 2)
- {
- //切换管制区域
- #region
- AGV_WPF.MainWindow.AGVStatus_TypStr agvM = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvM = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(agv);
- if (UsageTrafficAreaList[m].WaitAgv.Count == 0)
- {
- UsageTrafficAreaList[m].WaitAgv.Add(agvM);
- }
- else if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agvn = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- UsageTrafficAreaList[m].WaitAgv.Add(agvn);
- if (UsageTrafficAreaList[m].WaitAgv.Count > 1)
- {
- for (int jjj = UsageTrafficAreaList[m].WaitAgv.Count - 2; jjj >= 0; jjj--)
- {
- UsageTrafficAreaList[m].WaitAgv[jjj + 1] = EqualAgv(UsageTrafficAreaList[m].WaitAgv[jjj]);
- }
- UsageTrafficAreaList[m].WaitAgv[0] = EqualAgv(agvM);
- }
- }
- #endregion
- }
- }
- }
- else
- {
- if (AddAgvToWaitList(UsageTrafficAreaList[m].WaitAgv, agv, UsageTrafficAreaList[m].OccupyAgv) == 2)
- {
- //切换管制区域
- #region
- AGV_WPF.MainWindow.AGVStatus_TypStr agvM = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agvM = EqualAgv(UsageTrafficAreaList[m].OccupyAgv);
- UsageTrafficAreaList[m].OccupyAgv = EqualAgv(agv);
- if (UsageTrafficAreaList[m].WaitAgv.Count == 0)
- {
- UsageTrafficAreaList[m].WaitAgv.Add(agvM);
- }
- else if (UsageTrafficAreaList[m].WaitAgv.Count > 0)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agvn = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- UsageTrafficAreaList[m].WaitAgv.Add(agvn);
- if (UsageTrafficAreaList[m].WaitAgv.Count > 1)
- {
- for (int jjj = UsageTrafficAreaList[m].WaitAgv.Count - 2; jjj >= 0; jjj--)
- {
- UsageTrafficAreaList[m].WaitAgv[jjj + 1] = EqualAgv(UsageTrafficAreaList[m].WaitAgv[jjj]);
- }
- UsageTrafficAreaList[m].WaitAgv[0] = EqualAgv(agvM);
- }
- }
- #endregion
- }
- }
- #endregion
- }
- #endregion
- }
- }
- }
- if (!flag1) //表示agv所读的卡的区域再管制区域内,但是不在被激活的管制区域内
- {
- TrafficArea trafficNew = Equal(TrafficAreaList[i]);
- trafficNew.OccupyAgv = EqualAgv(agv);
- UsageTrafficAreaList.Add(Equal(trafficNew));
- flag1 = false;
- }
- #endregion
- }
- #endregion
- }
- }
- }
- #endregion
- }
- }
- }
- /// <summary>
- /// 获取需要管制的agv列表
- /// </summary>
- /// <returns></returns>
- public List<byte> GetTrafficAgvNum()
- {
- List<byte> agvNumList = new List<byte>();
- lock (UsageTrafficLock)
- {
- if (UsageTrafficAreaList.Count > 0)
- {
- for (int i = 0; i < UsageTrafficAreaList.Count; i++)
- {
- for (int j = 0; j < UsageTrafficAreaList[i].WaitAgv.Count; j++)
- {
- if (!agvNumList.Contains(UsageTrafficAreaList[i].WaitAgv[j].AgvNum))
- {
- agvNumList.Add(UsageTrafficAreaList[i].WaitAgv[j].AgvNum);
- }
- }
- }
- }
- }
- return (agvNumList);
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="waitList"></param>
- /// <param name="agv"></param>
- /// <param name="mainAgv"></param>
- /// <returns>0表示正确添加,1表示列表中存在相同的AGV,2表示互相管制</returns>
- private int AddAgvToWaitList(List<AGV_WPF.MainWindow.AGVStatus_TypStr> waitList,
- AGV_WPF.MainWindow.AGVStatus_TypStr agv, AGV_WPF.MainWindow.AGVStatus_TypStr mainAgv)
- {
-
- if (waitList.Count > 0)
- {
- for (int i = 0; i < waitList.Count; i++)
- {
- if (waitList[i].AgvNum == agv.AgvNum)
- {
- waitList[i] = agv;
- return (1);
- }
- }
- }
- #region//多区域防止两台AGV互相管制
- for (int i = 0; i < UsageTrafficAreaList.Count; i++)
- {
- if (UsageTrafficAreaList[i].OccupyAgv.AgvNum == agv.AgvNum)
- {
- if (UsageTrafficAreaList[i].WaitAgv.Count > 0)
- {
- for (int j = 0; j < UsageTrafficAreaList[i].WaitAgv.Count; j++)
- {
- if (UsageTrafficAreaList[i].WaitAgv[j].AgvNum == mainAgv.AgvNum) //5.18修改BUG
- {
-
- return(2);
- }
- }
- }
- }
- }
- #endregion
- waitList.Add(agv);
- return(0);
- }
- private TrafficArea Equal(TrafficArea TrafficAreaOld)
- {
- TrafficArea TrafficAreaNew = new TrafficArea();
- TrafficAreaNew.Number = TrafficAreaOld.Number;
- TrafficAreaNew.OccupyAgv = TrafficAreaOld.OccupyAgv;
- TrafficAreaNew.PointArr = TrafficAreaOld.PointArr;
- TrafficAreaNew.PointArrOut = TrafficAreaOld.PointArrOut;
- TrafficAreaNew.PointArrInside = TrafficAreaOld.PointArrInside;
- TrafficAreaNew.TypeTraffic = TrafficAreaOld.TypeTraffic;
- // TrafficAreaNew.Status = true;
- return (TrafficAreaNew);
- }
- private AGV_WPF.MainWindow.AGVStatus_TypStr EqualAgv(AGV_WPF.MainWindow.AGVStatus_TypStr agvOld)
- {
- AGV_WPF.MainWindow.AGVStatus_TypStr agv1 = new AGV_WPF.MainWindow.AGVStatus_TypStr();
- agv1.LineNum = agvOld.LineNum;
- agv1.Current = agvOld.Current;
- agv1.Direction = agvOld.Direction;
- agv1.DockNum = agvOld.DockNum;
- agv1.AgvNum = agvOld.AgvNum;
- agv1.MarkNum = agvOld.MarkNum;
- agv1.Speed = agvOld.Speed;
- agv1.Status = agvOld.Status;
- agv1.TrafficNum = agvOld.TrafficNum;
- agv1.WlLink = agvOld.WlLink;
- agv1.Voltage = agvOld.Voltage;
- return (agv1);
- }
- private int[] ToIntArray(string[] stringArr)
- {
-
- int[] intArray = new int[stringArr.Count()];
- if (stringArr.Count() > 0)
- {
- for (int i = 0; i < stringArr.Count(); i++)
- {
- intArray[i] = Convert.ToInt32(stringArr[i]);
- }
- }
- return (intArray);
- }
- public List< SAgvTraffic> GetTrafficAgv()
- {
- List<SAgvTraffic> agvTrafficList = new List< SAgvTraffic>();
- List<byte> agvNumList = new List<byte>();
- lock (UsageTrafficLock)
- {
- if (UsageTrafficAreaList.Count > 0)
- {
- for (int i = 0; i < UsageTrafficAreaList.Count; i++)
- {
- for (int j = 0; j < UsageTrafficAreaList[i].WaitAgv.Count; j++)
- {
- if (!agvNumList.Contains(UsageTrafficAreaList[i].WaitAgv[j].AgvNum))
- {
- agvNumList.Add(UsageTrafficAreaList[i].WaitAgv[j].AgvNum);
- SAgvTraffic trafficMsg = new SAgvTraffic();
- trafficMsg.AGVNUM = UsageTrafficAreaList[i].WaitAgv[j].AgvNum;
- trafficMsg.MIANAGVNUM = UsageTrafficAreaList[i].OccupyAgv.AgvNum;
- trafficMsg.TRAFFICAREANUM = UsageTrafficAreaList[i].Number;
- }
- }
- }
- }
- }
- return (agvTrafficList);
- }
- }
- public struct SAgvTraffic
- {
- public int AGVNUM;
- public int MIANAGVNUM ;
- public int TRAFFICAREANUM ;
- }
- }
|