123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using AGV_WPF.Models;
- using System.Configuration;
- using AGV_WPF_Global;
- using System.Threading;
- using System.ComponentModel;
- using AGV_WPF.NewCotent;
- using TrafficDll;
- namespace AGV_WPF.DataControl
- {
- public class AGVInfoService : IDisposable
- {
- #region 初始化缓存表
- Traffic kwtraffic;
- public void InitTraffic()
- {
- //kwtraffic = new Traffic();
- ////traffic_1 = new Traffic();
- //Thread GetTrafficAgvThread = new Thread(new ThreadStart(getTrafficAgvServer));
- //GetTrafficAgvThread.Start();
- }
- /// <summary>
- /// 初始化AGV缓存表数据
- /// </summary>
- /// <param name="AGVNUM_MAX"></param>
- public void InitAgvBuffer()
- {
- int AGVNUM_MAX = Convert.ToInt16(ConfigurationManager.AppSettings["AGVNUM_MAX"]);
- AGVInfoModel agv = null;
- IDictionary<int, AGVInfoModel> AgvDictionary = GlobalPara.AgvInfoDic;
- AgvDictionary.Clear();
- for (int i = 1; i <= AGVNUM_MAX; i++)
- {
- agv = new AGVInfoModel(i);
- AgvDictionary.Add(i, agv);
- }
- }
- #endregion
- #region 数据库增删改查操作
- /// <summary>
- /// 新增AGV信息
- /// </summary>
- /// <param name="agv"></param>
- /// <returns></returns>
- public void Add(AGVInfoModel agv)
- {
- DAL.ZSql sqlDelete = new DAL.ZSql();//数据库访问变量定义
- sqlDelete.Open("Insert into BAS_AGVINFO (AGVNUM,AGVNAME,MARKNUM,MARKFUN,RUNSTATUS,ROUTENUM,SPEEDLEVEL,ALARMCODE,ALARMINFO,"
- + "ConnectStatus,OffLineCount,IsMainAgv,TrafficNum,TrafficAgv) VALUES ("
- + agv.AGVNUM.ToString() + ",'" + agv.AGVNAME + "'," + agv.MARKNUM + ",'" + agv.MARKFUN + "',"
- + agv.RUNSTATUS + "," + agv.ROUTENUM + "," + agv.SPEEDLEVEL + "," + agv.ALARMCODE + ",'" + agv.ALARMINFO
- + agv.ConnectStatus + "," + agv.OffLineCount + "," + agv.IsMainAgv + "," + agv.TRAFFICNUM + "," + agv.TRAFFICAGV + "')");
- sqlDelete.Close();
- }
- /// <summary>
- /// 删除AGV信息
- /// </summary>
- /// <param name="agv"></param>
- /// <returns></returns>
- public bool Delete(AGVInfoModel agv)
- {
- DAL.ZSql sqlDelete = new DAL.ZSql();//数据库访问变量定义
- sqlDelete.Open("delete BAS_AGVINFO where AGVNUM='" + agv.AGVNUM.ToString() + "'");
- if (sqlDelete.rowcount > 0)
- {
- sqlDelete.Close();
- return true;
- }
- else
- {
- sqlDelete.Close();
- return false;
- }
- }
- /// <summary>
- /// 删除AGV信息
- /// </summary>
- /// <param name="agvnum"></param>
- /// <returns></returns>
- public bool Delete(int agvnum)
- {
- DAL.ZSql sqlDelete = new DAL.ZSql();//数据库访问变量定义
- sqlDelete.Open("delete BAS_AGVINFO where AGVNUM='" + agvnum.ToString() + "'");
- if (sqlDelete.rowcount > 0)
- {
- sqlDelete.Close();
- return true;
- }
- else
- {
- sqlDelete.Close();
- return false;
- }
- }
- /// <summary>
- /// 更新AGVINFO表信息
- /// </summary>
- /// <param name="agv"></param>
- public void Update(AGVInfoModel agv)
- {
- DAL.ZSql sqlUpdate = new DAL.ZSql();//数据库访问变量定义
- sqlUpdate.Open("Update BAS_AGVINFO(AGVNUM,AGVNAME,MARKNUM,MARKFUN,RUNSTATUS,ROUTENUM,SPEEDLEVEL,ALARMCODE,ALARMINFO,"
- + "ConnectStatus,OffLineCount,IsMainAgv,TrafficNum,TrafficAgv) VALUES ("
- + agv.AGVNUM.ToString() + ",'" + agv.AGVNAME + "'," + agv.MARKNUM + "," + agv.MARKFUN + "," + agv.RUNSTATUS
- + "," + agv.ROUTENUM + "," + agv.SPEEDLEVEL + "," + agv.ALARMCODE + ",'" + agv.ALARMINFO + "',"
- + agv.ConnectStatus + "," + agv.OffLineCount + "," + agv.IsMainAgv + "," + agv.TRAFFICNUM + "," + agv.TRAFFICAGV + "");
- sqlUpdate.Close();
- }
- /// <summary>
- /// 获取AGV信息数据
- /// </summary>
- /// <param name="agvnum"></param>
- /// <returns></returns>
- public AGVInfoModel GetAGVINFO(int agvnum)
- {
- DAL.ZSql dtAgvInfo = new DAL.ZSql();//数据库访问变量定义
- dtAgvInfo.Open("select AGVNUM,AGVNAME,MARKNUM,MARKFUN,RUNSTATUS,ROUTENUM,SPEEDLEVEL,ALARMCODE,ALARMINFO,"
- + "ConnectStatus,OffLineCount,IsMainAgv,TrafficNum,TrafficAgv from BAS_AGVINFO where AGVNUM='" + agvnum.ToString() + "'");
- AGVInfoModel agv = new AGVInfoModel();
- if (dtAgvInfo.rowcount > 0)
- {
- #region 数据字段赋值
- agv.AGVNUM = Convert.ToByte(dtAgvInfo.Rows[0]["AGVNUM"].ToString());
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["AGVNAME"].ToString()))
- {
- agv.AGVNAME = dtAgvInfo.Rows[0]["AGVNAME"].ToString();
- }
- else
- {
- agv.AGVNAME = "";
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["MARKNUM"].ToString()))
- {
- agv.MARKNUM = Convert.ToByte(dtAgvInfo.Rows[0]["MARKNUM"]);
- }
- else
- {
- agv.MARKNUM = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["MARKFUN"].ToString()))
- {
- agv.MARKFUN = Convert.ToByte(dtAgvInfo.Rows[0]["MARKFUN"]);
- }
- else
- {
- agv.MARKFUN = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["RUNSTATUS"].ToString()))
- {
- agv.RUNSTATUS = Convert.ToByte(dtAgvInfo.Rows[0]["RUNSTATUS"]);
- }
- else
- {
- agv.RUNSTATUS = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["ROUTENUM"].ToString()))
- {
- agv.ROUTENUM = Convert.ToByte(dtAgvInfo.Rows[0]["ROUTENUM"]);
- }
- else
- {
- agv.ROUTENUM = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["SPEEDLEVEL"].ToString()))
- {
- agv.SPEEDLEVEL = Convert.ToByte(dtAgvInfo.Rows[0]["SPEEDLEVEL"]);
- }
- else
- {
- agv.SPEEDLEVEL = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["ALARMCODE"].ToString()))
- {
- agv.ALARMCODE = dtAgvInfo.Rows[0]["ALARMCODE"].ToString();
- }
- else
- {
- agv.ALARMCODE = "无";
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["ALARMINFO"].ToString()))
- {
- agv.ALARMINFO = dtAgvInfo.Rows[0]["ALARMINFO"].ToString();
- }
- else
- {
- agv.ALARMINFO = "无";
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["ConnectStatus"].ToString()))
- {
- agv.ConnectStatus = Convert.ToBoolean(dtAgvInfo.Rows[0]["ConnectStatus"]);
- }
- else
- {
- agv.ConnectStatus = false;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["OffLineCount"].ToString()))
- {
- agv.OffLineCount = Convert.ToInt16(dtAgvInfo.Rows[0]["OffLineCount"]);
- }
- else
- {
- agv.OffLineCount = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["OffLineCount"].ToString()))
- {
- agv.IsMainAgv = Convert.ToBoolean(dtAgvInfo.Rows[0]["IsMainAgv"]);
- }
- else
- {
- agv.IsMainAgv = false;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["TRAFFICNUM"].ToString()))
- {
- int anum = Convert.ToInt16(dtAgvInfo.Rows[0]["TrafficNum"]);
- agv.TRAFFICNUM.Add(GlobalPara.TrafficBuffer[anum]);
- }
- else
- {
- agv.TRAFFICNUM.Clear();
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[0]["TRAFFICAGV"].ToString()))
- {
- int anum = Convert.ToInt16(dtAgvInfo.Rows[0]["TrafficAgv"]);
- agv.TRAFFICAGV = GlobalPara.AgvInfoDic[anum];
- }
- else
- {
- agv.TRAFFICAGV = null;
- }
- #endregion
- }
- dtAgvInfo.Close();
- return agv;
- }
- /// <summary>
- /// 获取所有AGVinfo信息
- /// </summary>
- /// <param name="agvnum"></param>
- /// <returns></returns>
- public List<AGVInfoModel> GetALL()
- {
- DAL.ZSql dtAgvInfo = new DAL.ZSql();//数据库访问变量定义
- dtAgvInfo.Open("select AGVNUM,AGVNAME,MARKNUM,MARKFUN,RUNSTATUS,ROUTENUM,SPEEDLEVEL,ALARMCODE,ALARMINFO,"
- + "ConnectStatus,OffLineCount,IsMainAgv,TrafficNum,TrafficAgv from BAS_AGVINFO");
- List<AGVInfoModel> listagv = new List<AGVInfoModel>(); //存放所有AGVINFO的列表
- AGVInfoModel agv = null;//存放1台rowcountAGV的对象
- int agvnum = 0;
- for (int i = 0; i < dtAgvInfo.rowcount; i++)
- {
- agv = new AGVInfoModel();
- agvnum = Convert.ToInt16(dtAgvInfo.Rows[i]["AGVNUM"]);
- #region 数据字段赋值
- agv.AGVNUM = agvnum;
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["AGVNAME"].ToString()))
- {
- agv.AGVNAME = dtAgvInfo.Rows[i]["AGVNAME"].ToString();
- }
- else
- {
- agv.AGVNAME = "";
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["MARKNUM"].ToString()))
- {
- agv.MARKNUM = Convert.ToByte(dtAgvInfo.Rows[i]["MARKNUM"]);
- }
- else
- {
- agv.MARKNUM = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["MARKFUN"].ToString()))
- {
- agv.MARKFUN = Convert.ToByte(dtAgvInfo.Rows[i]["MARKFUN"]);
- }
- else
- {
- agv.MARKFUN = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["RUNSTATUS"].ToString()))
- {
- agv.RUNSTATUS = Convert.ToByte(dtAgvInfo.Rows[i]["RUNSTATUS"]);
- }
- else
- {
- agv.RUNSTATUS = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["ROUTENUM"].ToString()))
- {
- agv.ROUTENUM = Convert.ToByte(dtAgvInfo.Rows[i]["ROUTENUM"]);
- }
- else
- {
- agv.ROUTENUM = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["SPEEDLEVEL"].ToString()))
- {
- agv.SPEEDLEVEL = Convert.ToByte(dtAgvInfo.Rows[i]["SPEEDLEVEL"]);
- }
- else
- {
- agv.SPEEDLEVEL = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["ALARMCODE"].ToString()))
- {
- agv.ALARMCODE = dtAgvInfo.Rows[i]["ALARMCODE"].ToString();
- }
- else
- {
- agv.ALARMCODE = "无";
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["ALARMINFO"].ToString()))
- {
- agv.ALARMINFO = dtAgvInfo.Rows[i]["ALARMINFO"].ToString();
- }
- else
- {
- agv.ALARMINFO = "无";
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["ConnectStatus"].ToString()))
- {
- agv.ConnectStatus = Convert.ToBoolean(dtAgvInfo.Rows[i]["ConnectStatus"]);
- }
- else
- {
- agv.ConnectStatus = false;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["OffLineCount"].ToString()))
- {
- agv.OffLineCount = Convert.ToInt16(dtAgvInfo.Rows[i]["OffLineCount"]);
- }
- else
- {
- agv.OffLineCount = 0;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["OffLineCount"].ToString()))
- {
- agv.IsMainAgv = Convert.ToBoolean(dtAgvInfo.Rows[i]["IsMainAgv"]);
- }
- else
- {
- agv.IsMainAgv = false;
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["TRAFFICNUM"].ToString()))
- {
- int tnum = Convert.ToInt16(dtAgvInfo.Rows[0]["TrafficNum"]);
- agv.TRAFFICNUM.Add(GlobalPara.TrafficBuffer[tnum]);
- }
- else
- {
- agv.TRAFFICNUM.Clear();
- }
- if (!string.IsNullOrEmpty(dtAgvInfo.Rows[i]["TRAFFICAGV"].ToString()))
- {
- int num = Convert.ToInt16(dtAgvInfo.Rows[0]["TrafficAgv"]);
- agv.TRAFFICAGV = GlobalPara.AgvInfoDic[num];
- }
- else
- {
- agv.TRAFFICAGV = null;
- }
- #endregion
- if (agv != null)
- {
- listagv.Add(agv);
- }
- }
- dtAgvInfo.Close();
- return listagv;
- }
- #endregion
- #region 更新缓存区AGV数据11
- /// <summary>
- /// 更新缓存区AGV运行数据
- /// </summary>
- /// <param name="agvdata">agv回复中控的数据</param>
- //public void UpdateBuffer(byte[] agvdata)
- //{
- // if (agvdata.Count() >=10)
- // {
- // int agvnum = agvdata[2];//agv编号
- // if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
- // {
- // //agv类
- // AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
- // agvinfo.AGVNUM = agvnum;
- // //地标卡号
- // int markNum = Convert.ToInt16(agvdata[3] | ((agvdata[7] & 0xC0) << 2));
- // agvinfo.MARKNUM = markNum;
- // {
- // #region 管制区
- // TrafficAreaService trafficService = new TrafficAreaService();
- // //上一管制区号
- // int lastTrafficNum = agvinfo.PTRAFFICNUM;
- // //当前管制区号
- // int currentTrafficNum;
- // //获取当前地标位置是否在管制区内
- // TrafficAreaModel traffic = trafficService.GetTraffic(markNum);
- // if (traffic != null)
- // {
- // currentTrafficNum = traffic.TrafficNum;
- // }
- // else
- // {
- // currentTrafficNum = 0;
- // }
- // TrafficAreaModel lastTraffic = null;
- // //获取上一管制区
- // if(GlobalPara.TrafficBuffer.Keys.Contains(lastTrafficNum))
- // {
- // lastTraffic = GlobalPara.TrafficBuffer[lastTrafficNum];
- // }
- // if (traffic != null)
- // {
- // #region 管制区内的情况
- // if (lastTrafficNum == 0)
- // {
- // #region agv从管制区外进入管制区内
- // traffic.InTraffic(agvinfo);//AGV加入管制区
- // //agvinfo.TRAFFICNUM = traffic.TrafficNum;
- // #endregion
- // }
- // else if (lastTrafficNum != 0)
- // {
- // if (lastTrafficNum != currentTrafficNum)
- // {
- // if (lastTraffic != null)
- // {
- // #region 从管制区A进入管制区B内
- // if (lastTraffic.OutTraffic(agvinfo))
- // {
- // traffic.InTraffic(agvinfo);
- // agvinfo.PTRAFFICNUM = agvinfo.PTRAFFICNUM;
- // //agvinfo.TRAFFICNUM = traffic.TrafficNum;
- // }
- // #endregion
- // }
- // }
- // }
- // #endregion
- // //agvinfo.TRAFFICNUM = traffic.TrafficNum;//当前管制区
- // }
- // else
- // {
- // #region 管制区外的情况
- // if (lastTrafficNum != 0 && currentTrafficNum == 0)
- // {
- // //agv从管制区内驶出管制区外
- // if(lastTraffic!=null) lastTraffic.OutTraffic(agvinfo);
- // }
- // #endregion
- // agvinfo.TRAFFICNUM = new List<TrafficAreaModel>();//当前管制区
- // }
- // #endregion
- // }
- // //当前地标功能
- // if (agvdata[4] > 0 && agvdata[4] < 32)
- // {
- // agvinfo.MARKFUN = agvdata[4];
- // }
- // agvinfo.RUNSTATUS = agvdata[5];
- // //报警信息处理
- // switch (agvdata[5])
- // {
- // #region 异常分类
- // case 1:
- // agvinfo.ALARMCODE = "1";
- // agvinfo.ALARMINFO = "无异常";
- // break;
- // case 2:
- // agvinfo.ALARMCODE = "2";
- // agvinfo.ALARMINFO = "急停报警";
- // break;
- // case 3:
- // agvinfo.ALARMCODE = "3";
- // agvinfo.ALARMINFO = "防撞报警";
- // break;
- // case 4:
- // agvinfo.ALARMCODE = "4";
- // agvinfo.ALARMINFO = "牵引棒报警";
- // break;
- // case 5:
- // agvinfo.ALARMCODE = "5";
- // agvinfo.ALARMINFO = "障碍物";
- // break;
- // case 6:
- // agvinfo.ALARMCODE = "6";
- // agvinfo.ALARMINFO = "跑错路线";
- // break;
- // case 7:
- // agvinfo.ALARMCODE = "7";
- // agvinfo.ALARMINFO = "电压报警";
- // break;
- // case 8:
- // agvinfo.ALARMCODE = "8";
- // agvinfo.ALARMINFO = "脱轨报警";
- // break;
- // case 9:
- // agvinfo.ALARMCODE = "9";
- // agvinfo.ALARMINFO = "低电压报警";
- // break;
- // case 10:
- // agvinfo.ALARMCODE = "10";
- // agvinfo.ALARMINFO = "低电压停机";
- // break;
- // case 11:
- // agvinfo.ALARMCODE = "11";
- // agvinfo.ALARMINFO = "超载报警";
- // break;
- // default:
- // agvinfo.ALARMCODE = "-1";
- // agvinfo.ALARMINFO = "未知异常";
- // break;
- // #endregion
- // }
- // agvinfo.ROUTENUM = agvdata[6];
- // //速度等级
- // int SpeedGrade = agvdata[7] & 0x3F;
- // if (SpeedGrade > 0 && SpeedGrade < 6)
- // {
- // agvinfo.SPEEDLEVEL = SpeedGrade;
- // }
- // agvinfo.OffLineCount = 0;
- // agvinfo.ConnectStatus = true;
- // }
- // }
- //}
- #endregion
- #region 更新缓存区AGV数据22
- public void UpdateBufferOld(List<byte> agvdata)
- {
- string a = "";
- if (agvdata.Count >= 10)
- {
- int agvnum = agvdata[2];//agv编号
- if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
- {
- #region 属性更新
- //agv类
- AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
- agvinfo.AGVNUM = agvnum;
- //----------------------------------------------------------------------
- /**修改人:胡文辉
- * 修改日期:2017-10-14
- * 修改内容:由于协议更改,获取地标卡号和路线编号的位置做了调整。
- * */
- //agvinfo.MARKNUM = agvdata[3] | ((agvdata[9] & 0xFF) << 8);
- if (!GlobalPara.UseNewProtrol)
- {
- agvinfo.MARKNUM = Convert.ToInt16(agvdata[3] | ((agvdata[7] & 0xC0) << 2));
- agvinfo.ROUTENUM = agvdata[6];
- if (agvdata[4] > 0 && agvdata[4] < 32)
- {
- agvinfo.MARKFUN = agvdata[4];
- }
- agvinfo.RUNSTATUS = agvdata[5];
- //报警信息处理
- switch (agvdata[5])
- {
- #region 异常分类
- case 1:
- agvinfo.ALARMCODE = "1";
- agvinfo.ALARMINFO = "无异常";
- break;
- case 2:
- agvinfo.ALARMCODE = "2";
- agvinfo.ALARMINFO = "急停报警";
- break;
- case 3:
- agvinfo.ALARMCODE = "3";
- agvinfo.ALARMINFO = "防撞报警";
- break;
- case 4:
- agvinfo.ALARMCODE = "4";
- agvinfo.ALARMINFO = "牵引棒报警";
- break;
- case 5:
- agvinfo.ALARMCODE = "5";
- agvinfo.ALARMINFO = "障碍物";
- break;
- case 6:
- agvinfo.ALARMCODE = "6";
- agvinfo.ALARMINFO = "跑错路线";
- break;
- case 7:
- agvinfo.ALARMCODE = "7";
- agvinfo.ALARMINFO = "电压报警";
- break;
- case 8:
- agvinfo.ALARMCODE = "8";
- agvinfo.ALARMINFO = "脱轨报警";
- break;
- case 9:
- agvinfo.ALARMCODE = "9";
- agvinfo.ALARMINFO = "低电压报警";
- break;
- case 10:
- agvinfo.ALARMCODE = "10";
- agvinfo.ALARMINFO = "低电压停机";
- break;
- case 11:
- agvinfo.ALARMCODE = "11";
- agvinfo.ALARMINFO = "超载报警";
- break;
- default:
- agvinfo.ALARMCODE = "-1";
- agvinfo.ALARMINFO = "未知异常";
- break;
- #endregion
- }
- //速度等级
- int SpeedGrade = agvdata[7] & 0x3F;
- if (SpeedGrade > 0 && SpeedGrade < 6)
- {
- agvinfo.SPEEDLEVEL = SpeedGrade;
- }
- agvinfo.OffLineCount = 0;
- agvinfo.ConnectStatus = true;
- }
- else
- {
- //19位数据解析
- if (agvdata.Count >= 19)
- {
- agvinfo.MARKNUM = ((int)agvdata[3] << 8 | agvdata[4]);
- agvinfo.ROUTENUM = ((int)agvdata[8] << 8 | agvdata[9]);
- if (agvdata[5] > 0 && agvdata[5] < 32)
- {
- agvinfo.MARKFUN = agvdata[5];
- }
- agvinfo.RUNSTATUS = agvdata[7];
- switch (agvdata[6])
- {
- #region 异常分类
- case 1:
- agvinfo.ALARMCODE = "1";
- agvinfo.ALARMINFO = "无异常";
- break;
- case 2:
- agvinfo.ALARMCODE = "2";
- agvinfo.ALARMINFO = "急停报警";
- break;
- case 3:
- agvinfo.ALARMCODE = "3";
- agvinfo.ALARMINFO = "防撞报警";
- break;
- case 4:
- agvinfo.ALARMCODE = "4";
- agvinfo.ALARMINFO = "牵引棒报警";
- break;
- case 5:
- agvinfo.ALARMCODE = "5";
- agvinfo.ALARMINFO = "障碍物";
- break;
- case 6:
- agvinfo.ALARMCODE = "6";
- agvinfo.ALARMINFO = "跑错路线";
- break;
- case 7:
- agvinfo.ALARMCODE = "7";
- agvinfo.ALARMINFO = "电压报警";
- break;
- case 8:
- agvinfo.ALARMCODE = "8";
- agvinfo.ALARMINFO = "脱轨报警";
- break;
- case 9:
- agvinfo.ALARMCODE = "9";
- agvinfo.ALARMINFO = "低电压报警";
- break;
- case 10:
- agvinfo.ALARMCODE = "10";
- agvinfo.ALARMINFO = "低电压停机";
- break;
- case 11:
- agvinfo.ALARMCODE = "11";
- agvinfo.ALARMINFO = "超载报警";
- break;
- default:
- agvinfo.ALARMCODE = "-1";
- agvinfo.ALARMINFO = "未知异常";
- break;
- #endregion
- }
- if (agvdata[6] != 0)
- {
- agvinfo.RUNSTATUS = agvdata[6];
- }
- //agvinfo.ALARMCODE = ((int)agvdata[6]).ToString() ;
- int SpeedGrade = agvdata[10];
- if (SpeedGrade > 0 && SpeedGrade < 6)
- {
- agvinfo.SPEEDLEVEL = SpeedGrade;
- }
- agvinfo.OffLineCount = 0;
- agvinfo.ConnectStatus = true;
- agvinfo.Bttery_Voltage = (decimal)(((int)agvdata[3] << 11 | agvdata[12]) / 100.0);
- agvinfo.Battery_Electricity = (decimal)(((int)agvdata[13] << 11 | agvdata[14]) / 100.0);
- }
- }
- #endregion
- #region 管制区逻辑处理部分
- TrafficAreaService trafficService = new TrafficAreaService();
- //前管制区号
- //拷贝一份另存为
- if (agvinfo.PTRAFFICNUM != agvinfo.TRAFFICNUM)
- {
- agvinfo.PTRAFFICNUM.Clear();
- agvinfo.PTRAFFICNUM.AddRange(agvinfo.TRAFFICNUM);
- }
- //最新管制区号
- //获取当前地标位置是否在管制区内
- List<TrafficAreaModel> newTrafficList = trafficService.GetTrafficList(agvinfo.MARKNUM, agvinfo.ROUTENUM, agvnum);
- List<TrafficAreaModel> outTrafficList = new List<TrafficAreaModel>();
- outTrafficList.AddRange(agvinfo.PTRAFFICNUM);
- bool isChange = CheckChange(agvinfo.TRAFFICNUM, newTrafficList);
- //检查旧管制区与新管制区是否有变化,有变化才需要检查AGV的管制状态的逻辑变化。
- if (isChange)
- {
- #region 管制区数据更新
- if (newTrafficList.Count > 0)
- {
- #region 标明进入了管制区(交叉管制区或独立管制区)
- {
- foreach (TrafficAreaModel traffic in newTrafficList)
- {
- //添加AGV的管制区对象列表
- if (!agvinfo.TRAFFICNUM.Contains(traffic))
- {
- //添加最新的管制区
- agvinfo.TRAFFICNUM.Add(traffic);
- //管制区有AGV进入
- traffic.AGVINTER(agvinfo, false);
- }
- if (outTrafficList.Contains(traffic))
- {
- outTrafficList.Remove(traffic);
- }
- }
- }
- //循环把AGV已经退出的管制区给处理一下。
- foreach (TrafficAreaModel traffic in outTrafficList)
- {
- //管制区有AGV离开
- agvinfo.TRAFFICNUM.Remove(traffic);
- traffic.AGVLEAVE(agvinfo);
- if (traffic.listAgvQueue.Count > 0)
- {
- traffic.ReleaseAgv(); //调用放行事件
- }
- }
- #endregion
- }
- else
- {
- #region 表示AGV现在不在任何管制区
- foreach (TrafficAreaModel traffic in outTrafficList)
- {
- agvinfo.TRAFFICNUM.Remove(traffic);
- traffic.AGVLEAVE(agvinfo);
- if (traffic.listAgvQueue.Count > 0)
- {
- traffic.ReleaseAgv(); //调用放行事件
- }
- }
- if (agvinfo.TrafficFlag)
- {
- agvinfo.TrafficFlag = false;
- agvinfo.TRAFFICAGV = null;
- }
- #endregion
- }
- #endregion
- #region 管制区的数据更新后,判定AGV的管制状态
- //AGV只有在所有管制区成为主机的情况下,才能不被管制
- bool isTraffic = false;//标识AGV是否应该被管制,true表示应该不管制;false表示不应该不管制
- //int agv=0;
- #region 遍历AGV现在的管制区,寻找是否有某个管制区还管制着本AGV(我自己)
- foreach (var traffic in agvinfo.TRAFFICNUM)
- {
- //一旦发现AGV在某个管制区还不是主机,则把AGV管制住
- if (agvinfo != traffic.MainAgv)
- {
- if (traffic.listAgvQueue.Contains(traffic.MainAgv))
- {
- traffic.MainAgv = agvinfo;
- agvinfo.TrafficFlag = false;
- isTraffic = false;
- break;
- }
- else
- {
- isTraffic = true;
- agvinfo.TRAFFICAGV = traffic.MainAgv;//---LG修改方便查看主机
- break;
- }
- }
- }
- #endregion
- #region 发现AGV需要被管制
- if (isTraffic)
- {
- agvinfo.TrafficFlag = true;
- }
- else
- {
- agvinfo.TrafficFlag = false;
- agvinfo.TRAFFICAGV = null;
- foreach (var traffic in outTrafficList)
- {
- if (traffic.MainAgv != null)
- {
- traffic.ReleaseMainAgv();
- }
- else
- {
- if (traffic.listAgvQueue.Count > 0)
- {
- traffic.ReleaseAgv(traffic.listAgvQueue[0]);
- }
- }
- }
- }
- #endregion
- #endregion
- #region 管制区数据更新日志记录
- //StringBuilder a1 = new StringBuilder();
- //foreach (var n in agvinfo.TRAFFICNUM)
- //{
- // a1.Append("->"+n.TrafficNum);
- //}
- //if (a1.Length > 1)
- //{
- // a1.Remove(0, 2);
- // a1.Append("|");
- //}
- //else
- //{
- // a1.Append("无");
- //}
- //string marktime = DateTime.Now.ToString("HH:mm:ss");
- //a = string.Format("{5} : AGV编号:{0} --AGV管制状态:{1} --当前地标:{2} --当前路线:{3} --当前管制区:{4} --当前AGV管制区主机:{6}", agvinfo.AGVNUM, agvinfo.TrafficFlag, agvinfo.MARKNUM, agvinfo.ROUTENUM, a1, marktime,agvinfo.TRAFFICAGV);
- //ErrorLog.WriteErrorLogagv(a);
- #endregion
- }
- #endregion
- #region 罗国--预防管制区只有一辆车还被管制住。
- bool SigleFlag = false;
- bool SigleFlag1 = false;
- if (agvinfo.TrafficFlag)
- {
- foreach (var agvtrffic in agvinfo.TRAFFICNUM)
- {
- if (agvinfo.TRAFFICAGV == null)//没有主机的时候不放行
- {
- if (agvtrffic.listAgvQueue.Count == 0)
- {
- SigleFlag = true;
- }
- else if (agvtrffic.listAgvQueue.Count == 1)
- {
- if (agvtrffic.listAgvQueue[0] == agvinfo)
- {
- SigleFlag = true;
- }
- }
- else
- {
- SigleFlag = false;
- break;
- }
- }
- else//有主机不放行
- {
- foreach (var agvtraffic1 in agvinfo.TRAFFICAGV.TRAFFICNUM)
- {
- if (agvtraffic1 == agvtrffic)//有相同的区域
- {
- SigleFlag1 = false;
- break;
- }
- else
- {
- SigleFlag1 = true;
- }
- }
- if (!SigleFlag1)
- {
- break;
- }
- }
- }
- if (SigleFlag)//确定只有一台AGV把AGV
- {
- agvinfo.TrafficFlag = false;
- foreach (var traffic1 in agvinfo.TRAFFICNUM)//清空队列中所有的AGV
- {
- traffic1.MainAgv = agvinfo;
- if (traffic1.listAgvQueue.Contains(agvinfo))
- {
- traffic1.listAgvQueue.Remove(agvinfo);
- }
- }
- }
- if (SigleFlag1)//有主机的处理,且主机不在管制区域内
- {
- agvinfo.TrafficFlag = false;
- foreach (var traffic2 in agvinfo.TRAFFICNUM)//清空队列中AGV的主机
- {
- traffic2.MainAgv = agvinfo;
- if (traffic2.listAgvQueue.Contains(agvinfo.TRAFFICAGV))
- {
- traffic2.listAgvQueue.Remove(agvinfo.TRAFFICAGV);
- }
- }
- }
- }
- #endregion
- #region 罗国--预防多管制区里互相管制
- if (agvinfo.TrafficFlag)//在被管制的前提下
- {
- if (agvinfo.TRAFFICNUM.Count >= 2)//在多个管制区的互相管制随机放行
- {
- if (agvinfo.TRAFFICAGV.TRAFFICAGV == agvinfo)//主机的主机等于主机说明互相管制了
- {
- agvinfo.TrafficFlag = false;
- foreach (var traffic1 in agvinfo.TRAFFICNUM)//清空队列中所有的AGV
- {
- traffic1.MainAgv = agvinfo;
- if (traffic1.listAgvQueue.Contains(agvinfo))
- {
- traffic1.listAgvQueue.Remove(agvinfo);
- }
- if (traffic1.listAgvQueue.Contains(agvinfo.TRAFFICAGV))//把被管制的agv放在各个管制区的队列第一位
- {
- traffic1.listAgvQueue.Remove(agvinfo.TRAFFICAGV);
- traffic1.listAgvQueue.Insert(0, agvinfo.TRAFFICAGV);
- }
- }
- }
- }
- }
- #endregion
- #region 避免关机重启后管制状态还保留,导致放行不了
- if (agvinfo.TRAFFICNUM.Count == 0)
- {
- agvinfo.TrafficFlag = false;
- agvinfo.TRAFFICAGV = null;
- }
- #endregion
- #region 在管制区中平行的时候就不管制了
- if (GlobalPara.IsEnablePallel)
- {
- agvinfo.ParallelFlag = CheckRouteFlag(agvinfo.MARKNUM, agvinfo.ROUTENUM, agvinfo.AGVNUM);//实时检查AGV所在的地标和路线是否处于平行的时候
- agvinfo.Direction = CheckDirectionFlag(agvinfo.MARKNUM, agvinfo.ROUTENUM, agvinfo.AGVNUM);//实时检查AGV所在路线上的放向
- if (agvinfo.TrafficFlag)
- {
- bool falg1 = false;
- bool falg2 = false;
- int indexrow = 0;
- for (int j = 0; j < agvinfo.TRAFFICNUM.Count; j++)
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv != null)//如果等零的话
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv != agvinfo)
- {
- if (agvinfo.ParallelFlag && agvinfo.TRAFFICNUM[j].MainAgv.ParallelFlag)
- {
- falg1 = true;
- }
- else
- {
- falg1 = false;
- break;
- }
- }
- }
- }
- for (int j = 0; j < agvinfo.TRAFFICNUM.Count; j++)
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv != null)//如果等零的话
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv != agvinfo)
- {
- for (int i = 0; i < agvinfo.Direction.Count; i++)
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv.Direction.Contains(agvinfo.Direction[i]))//方向相同则放行
- {
- falg2 = true;
- break;
- }
- else
- {
- falg2 = false;
- }
- }
- }
- }
- }
- if (falg1 && falg2)//只有是平行线且方向一致时才不管制
- {
- agvinfo.TrafficFlag = false;
- for (int i = 0; i < agvinfo.TRAFFICNUM.Count; i++)
- {
- if (agvinfo.TRAFFICNUM[i].listAgvQueue.Contains(agvinfo))
- {
- agvinfo.TRAFFICNUM[i].listAgvQueue.Remove(agvinfo);
- agvinfo.TRAFFICNUM[i].listAgvQueue.Insert(0, agvinfo);//把放行的agv排到队列前面
- }
- }
- }
- }
- }
- #endregion
- }
- }
- }
- /// <summary>
- /// 获取agv管制状态
- /// </summary>
- /// <summary>
- /// 检查管制区数据是否变化
- /// </summary>
- /// <param name="list"></param>
- /// <param name="newTrafficList"></param>
- /// <returns></returns>
- private bool CheckChange(List<TrafficAreaModel> list, List<TrafficAreaModel> newTrafficList)
- {
- if (list.Count != newTrafficList.Count)
- {
- return true;
- }
- else
- {
- if (list.Count == 0)
- {
- return true;
- }
- else
- {
- foreach (TrafficAreaModel tam in newTrafficList)
- {
- if (!list.Contains(tam))
- {
- return true;
- }
- // break;
- }
- }
- }
- return false;
- }
- /// <summary>
- /// 检查路线是否平行
- /// </summary>
- /// <returns></returns>
- private bool CheckRouteFlag(int mark, int route, int agvnum)
- {
- DAL.ZSql sql1 = new DAL.ZSql();
- int trafficnum = 0;
- string a = "select DISTINCT Parallel from T_Line where LineNum=" + route + "and MarkID=(select ID from T_Mark where Mark=" + mark + "and WorkLine=(select WorkLine from T_WorkLine where CarID=" + agvnum + ")) ";
- sql1.Open(a);
- if (sql1.Rows.Count > 0)
- {
- trafficnum = Convert.ToInt32(sql1.m_table.Rows[0]["Parallel"]);
- }
- if (trafficnum == 1)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- /// <summary>
- /// 检查路线是否平行
- /// </summary>
- /// <returns></returns>
- private List<int> CheckDirectionFlag(int mark, int route, int agvnum)
- {
- List<int> Directionlist = new List<int>();
- DAL.ZSql sql1 = new DAL.ZSql();
- int trafficnum = -1;
- string a = "select DISTINCT Direction from T_Line where LineNum=" + route + "and MarkID=(select ID from T_Mark where Mark=" + mark + "and WorkLine=(select WorkLine from T_WorkLine where CarID=" + agvnum + ") )";
- sql1.Open(a);
- if (sql1.Rows.Count > 0)
- {
- for (int i = 0; i < sql1.m_table.Rows.Count; i++)
- {
- if (!string.IsNullOrEmpty(sql1.m_table.Rows[i]["Direction"].ToString()))
- {
- trafficnum = Convert.ToInt32(sql1.m_table.Rows[i]["Direction"]);
- Directionlist.Add(trafficnum);
- }
- }
- }
- return Directionlist;
- }
- #endregion
- #region 功能性函数
- #region 把byte字符串转化成为AGVInfo对象(废弃)
- /// <summary>
- /// 把byte字符串转化成为AGVInfo对象
- /// </summary>
- /// <param name="tempBuffer"></param>
- /// <returns></returns>
- //public static AGVInfoModel ToAgvInfo(byte[] tempBuffer)
- //{
- // AGVInfoModel agvinfo = new AGVInfoModel();
- // if (DataHandle.DataCheck(tempBuffer) == 0)
- // {
- // agvinfo.AGVNUM = tempBuffer[2];
- // //agvinfo.AGVNAME = "";
- // agvinfo.MARKNUM = tempBuffer[3];
- // agvinfo.MARKFUN = tempBuffer[4].ToString();
- // agvinfo.RUNSTATUS = tempBuffer[5];
- // switch (tempBuffer[5])
- // {
- // #region 异常分类
- // case 1:
- // agvinfo.ALARMCODE = 1;
- // agvinfo.ALARMINFO = "无异常";
- // break;
- // case 2:
- // agvinfo.ALARMCODE = 2;
- // agvinfo.ALARMINFO = "急停报警";
- // break;
- // case 3:
- // agvinfo.ALARMCODE = 3;
- // agvinfo.ALARMINFO = "防撞报警";
- // break;
- // case 4:
- // agvinfo.ALARMCODE = 4;
- // agvinfo.ALARMINFO = "牵引棒报警";
- // break;
- // case 5:
- // agvinfo.ALARMCODE = 5;
- // agvinfo.ALARMINFO = "障碍物";
- // break;
- // case 6:
- // agvinfo.ALARMCODE = 6;
- // agvinfo.ALARMINFO = "跑错路线";
- // break;
- // case 7:
- // agvinfo.ALARMCODE = 7;
- // agvinfo.ALARMINFO = "电压报警";
- // break;
- // case 8:
- // agvinfo.ALARMCODE = 8;
- // agvinfo.ALARMINFO = "脱轨报警";
- // break;
- // case 9:
- // agvinfo.ALARMCODE = 9;
- // agvinfo.ALARMINFO = "低电压报警";
- // break;
- // case 10:
- // agvinfo.ALARMCODE = 10;
- // agvinfo.ALARMINFO = "低电压停机";
- // break;
- // case 11:
- // agvinfo.ALARMCODE = 11;
- // agvinfo.ALARMINFO = "超载报警";
- // break;
- // default:
- // agvinfo.ALARMCODE = -1;
- // agvinfo.ALARMINFO = "未知异常";
- // break;
- // #endregion
- // }
- // agvinfo.ROUTENUM = tempBuffer[6];
- // agvinfo.SPEEDLEVEL = tempBuffer[7];
- // #region 电池信息
- // //agvinfo.batteryDatas.Add(tempBuffer[8].ToString());
- // //agvinfo.batteryDatas.Add(tempBuffer[9].ToString());
- // //agvinfo.batteryDatas.Add(tempBuffer[10].ToString());
- // //agvinfo.batteryDatas.Add(tempBuffer[11].ToString());
- // //agvinfo.batteryDatas.Add(tempBuffer[12].ToString());
- // //agvinfo.batteryDatas.Add(tempBuffer[13].ToString());
- // #endregion
- // }
- // return agvinfo;
- //}
- #endregion
- /// <summary>
- /// 存放字节数组的list
- /// </summary>
- public static List<byte[]> list = new List<byte[]>();
- /// <summary>
- /// 把字节数组中有效的协议数组拆分下来
- /// </summary>
- /// <param name="buffer"></param>
- public static void byteList(byte[] buffer)
- {
- #region 数据解析,拆分有用的字节数组
- if (buffer.Length == 10)
- {
- if (buffer[0] == 0x10)
- {
- if (buffer[9] == 0x03 && buffer[8] == XOR_Check(buffer, 0, 8))
- {
- list.Add(buffer);
- }
- }
- }
- else if (buffer.Length > 10)
- {
- if (buffer[0] == 0x10)
- {
- if (buffer[9] == 0x03 && buffer[8] == XOR_Check(buffer, 0, 8))
- {
- byte[] temp = new byte[10];
- byte[] last = new byte[buffer.Length - 10];
- buffer.CopyTo(temp, 0);
- buffer.CopyTo(last, 0);
- list.Add(temp);
- byteList(last);
- }
- }
- }
- #endregion
- }
- /// <summary>
- /// 取异或校验码
- /// </summary>
- /// <param name="buf"></param>
- /// <param name="index"></param>
- /// <param name="length"></param>
- /// <returns></returns>
- public static byte XOR_Check(byte[] buf, int index, int length)
- {
- byte bcc = 0;
- if (index > length)
- return 0;
- for (int i = index; i < length; i++)
- {
- bcc ^= buf[i];
- }
- return Convert.ToByte(bcc);
- }
- #endregion
- #region 管制逻辑
- public bool RequestTrafficState(AGVInfoModel agv, TrafficAreaModel traffic)
- {
- int lastTrafficNum = agv.TRAFFICNUM.Count();
- int currentTrafficNum;
- bool AgvtrafficFlag = false;
- if (traffic != null)
- {
- currentTrafficNum = traffic.TrafficNum;
- }
- else
- {
- currentTrafficNum = 0;
- }
- if (lastTrafficNum == 0 && currentTrafficNum != 0)
- {
- #region agv从管制区外进入管制区内
- return InTraffic(traffic, agv);//AGV加入管制区
- #endregion
- }
- else if (lastTrafficNum != 0 && currentTrafficNum == 0)
- {
- #region agv从管制区内驶出管制区外
- if (OutTraffic(lastTrafficNum, agv))
- {
- return AgvtrafficFlag = false;
- }
- #endregion
- }
- else if (lastTrafficNum != 0 && currentTrafficNum != 0 && lastTrafficNum != currentTrafficNum)
- {
- #region 从管制区A进入管制区B
- if (OutTraffic(lastTrafficNum, agv))
- {
- //trafficAgvNum = traffic.MainAgv;
- return InTraffic(traffic, agv);
- }
- #endregion
- }
- else
- {
- //未知情况
- }
- return AgvtrafficFlag;
- }
- public bool OutTraffic(int trafficNum, AGVInfoModel agv)
- {
- if (agv == null)
- {
- return false;
- }
- if (GlobalPara.TrafficBuffer.Keys.Contains(trafficNum))
- {
- TrafficAreaModel outttraffic = GlobalPara.TrafficBuffer[trafficNum];
- //if (lasttraffic != null)
- {
- //把我从就管制区的agv列表中删除
- if (GlobalPara.TrafficBuffer[trafficNum].listAgvQueue.Contains(agv))
- {
- GlobalPara.TrafficBuffer[trafficNum].listAgvQueue.Remove(agv);
- }
- //我是旧管制区的主机,更新旧管制区数据
- if (GlobalPara.TrafficBuffer[trafficNum].MainAgv == agv)
- {
- if (GlobalPara.TrafficBuffer[trafficNum].listAgvQueue.Count > 0)
- {
- GlobalPara.TrafficBuffer[trafficNum].MainAgv = GlobalPara.TrafficBuffer[trafficNum].listAgvQueue[0];
- GlobalPara.TrafficBuffer[trafficNum].IsTraffic = true;
- AGVInfoModel newMainAgv = GlobalPara.TrafficBuffer[trafficNum].MainAgv;
- newMainAgv.TRAFFICAGV = null;
- newMainAgv.TrafficFlag = false;
- }
- else
- {
- GlobalPara.TrafficBuffer[trafficNum].IsTraffic = false;
- GlobalPara.TrafficBuffer[trafficNum].MainAgv = null;
- }
- }
- if (agv.TRAFFICNUM.Contains(outttraffic))
- {
- agv.TRAFFICNUM.Remove(outttraffic);//更新agv管制区编号
- }
- agv.TrafficFlag = false;
- agv.TRAFFICAGV = null;
- return true;
- }
- }
- return false;
- }
- public bool InTraffic(TrafficAreaModel traffic, AGVInfoModel agv)
- {
- if (traffic != null && agv != null)
- {
- //加入管制区agv列表
- if (!traffic.listAgvQueue.Contains(agv))
- {
- traffic.listAgvQueue.Add(agv);
- }
- //判断管制区是否有主机
- if (traffic.MainAgv == null)
- {
- //把队列中的第一位变成agv
- traffic.MainAgv = traffic.listAgvQueue[0];
- //检查管制区管制状态
- if (!traffic.IsTraffic)
- {
- traffic.IsTraffic = true;
- }
- }
- else
- {
- //判断我是不是主机
- if (traffic.MainAgv != agv)
- {
- //非主机:返回管制状态为true,管制agv为管制区主机agv编号
- agv.TRAFFICAGV = traffic.MainAgv;
- agv.TrafficFlag = true;
- return true;
- }
- else
- {
- //是主机:管制状态为false,管制agv为0
- agv.TRAFFICAGV = null;
- agv.TrafficFlag = false;
- return false;
- }
- }
- }
- return agv.TrafficFlag;
- }
- public bool InTraffic(int trafficNum, AGVInfoModel agv)
- {
- if (GlobalPara.TrafficBuffer.Keys.Contains(trafficNum))
- {
- TrafficAreaModel newtraffic = GlobalPara.TrafficBuffer[trafficNum];
- if (newtraffic != null)
- {
- //agv.TRAFFICNUM = newtraffic.TrafficNum;//更新agv管制区编号
- //加入管制区agv列表
- if (!newtraffic.listAgvQueue.Contains(agv))
- {
- newtraffic.listAgvQueue.Add(agv);
- }
- //判断管制区是否有主机
- if (newtraffic.MainAgv == null)
- {
- //把队列中的第一位变成agv
- newtraffic.MainAgv = newtraffic.listAgvQueue[0];
- //检查管制区管制状态
- if (!newtraffic.IsTraffic)
- {
- newtraffic.IsTraffic = true;
- }
- }
- else
- {
- //判断我是不是主机
- if (newtraffic.MainAgv != agv)
- {
- //非主机:返回管制状态为true,管制agv为管制区主机agv编号
- agv.TRAFFICAGV = newtraffic.MainAgv;
- agv.TrafficFlag = true;
- }
- else
- {
- //是主机:管制状态为false,管制agv为0
- agv.TRAFFICAGV = null;
- agv.TrafficFlag = false;
- }
- }
- return true;
- }
- }
- return false;
- }
- #endregion
- public void Dispose()
- {
- //throw new NotImplementedException();
- }
- private static void ArrangeBuffer(List<byte> bufferList, byte targetByte)
- {
- int delBytes = 1;
- for (int i = 1; i < bufferList.Count; i++)
- {
- if (bufferList[i] == targetByte)
- {
- break;
- }
- else
- {
- delBytes++;
- }
- }
- try
- {
- lock (portLock)
- {
- bufferList.RemoveRange(0, delBytes);
- }
- }
- catch (Exception ex)
- {
- //MessageBox.Show(ex.Message);
- }
- }
- private static object portLock = new object();
- public void UpdateBuffer(List<byte> receiveBuffer)
- {
- List<byte> frameFuncList = new List<byte> { 0x41, 0x42, 0x46, 0x32, 0x33, 0x35, 0x38 };
- while (receiveBuffer.Count >= 10)
- {
-
- byte frameHead = 0x10; // 帧头
- byte frameTaig = 0x03;
-
-
- if ((receiveBuffer[0] == frameHead) && (receiveBuffer.Count >= 14) && frameFuncList.Contains(receiveBuffer[1]))
- {
- byte checkSum = 0x00;
- for (int i = 0; i < 12; i++)
- {
- checkSum ^= receiveBuffer[i];
- }
- if (checkSum == receiveBuffer[12] && frameTaig == receiveBuffer[13])
- {
- byte[] data = new byte[14];
- for (int i = 0; i < 14; i++)
- {
- data[i] = receiveBuffer[i];
- }
- lock (portLock)
- {
- receiveBuffer.RemoveRange(0, 14);
- }
- //data丢到调度板块去处理
- GlobalPara.dispatchList.Add(data);
- }
- else
- {
- ArrangeBuffer(receiveBuffer, frameHead);
- }
- }
- else if ((receiveBuffer[0] == frameHead) && (receiveBuffer.Count >= 12) && receiveBuffer[1] == 0x64)
- {
- byte checkSum = 0x00;
- for (int i = 0; i < 10; i++)
- {
- checkSum ^= receiveBuffer[i];
- }
- if (checkSum == receiveBuffer[10] && frameTaig == receiveBuffer[11])
- {
- byte[] agvdata = new byte[12];
- for (int i = 0; i < 12; i++)
- {
- agvdata[i] = receiveBuffer[i];
- }
- lock (portLock)
- {
- receiveBuffer.RemoveRange(0, 12);
- }
- //解析新协议
- int agvnum = agvdata[2];
- if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
- {
- #region 属性更新
- AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
- agvinfo.AGVNUM = agvnum;
- agvinfo.MARKNUM = Convert.ToInt32(agvdata[4] | ((agvdata[3] & 0x1F) ));
- agvinfo.ROUTENUM = Convert.ToInt32(agvdata[9] | ((agvdata[8] & 0x1F) ));
- if (agvdata[5] > 0 && agvdata[5] < 32)
- {
- agvinfo.MARKFUN = agvdata[5];
- }
- agvinfo.FPS = (int)((agvdata[3] & 0xE0) >> 5);
- if (agvinfo.FPS == 1)
- {
- agvinfo.RUNSTATUS_Cur = agvinfo.RUNSTATUS = (((agvdata[8] & 0xE0) >> 5) + 0x40);
- //报警信息处理
- switch (agvdata[6] + 1)
- {
- #region 异常分类
- case 1:
- agvinfo.ALARMCODE = "1";
- agvinfo.ALARMINFO = "无异常";
- break;
- case 2:
- agvinfo.ALARMCODE = "2";
- agvinfo.ALARMINFO = "急停报警";
- break;
- case 3:
- agvinfo.ALARMCODE = "3";
- agvinfo.ALARMINFO = "防撞报警";
- break;
- case 4:
- agvinfo.ALARMCODE = "4";
- agvinfo.ALARMINFO = "牵引棒报警";
- break;
- case 5:
- agvinfo.ALARMCODE = "5";
- agvinfo.ALARMINFO = "障碍物";
- break;
- case 6:
- agvinfo.ALARMCODE = "6";
- agvinfo.ALARMINFO = "路线异常";
- break;
- case 7:
- agvinfo.ALARMCODE = "7";
- agvinfo.ALARMINFO = "电压异常";
- break;
- case 8:
- agvinfo.ALARMCODE = "8";
- agvinfo.ALARMINFO = "脱轨报警";
- break;
- case 9:
- agvinfo.ALARMCODE = "9";
- agvinfo.ALARMINFO = "低电压报警";
- break;
- case 10:
- agvinfo.ALARMCODE = "10";
- agvinfo.ALARMINFO = "低电压停机";
- break;
- case 11:
- agvinfo.ALARMCODE = "11";
- agvinfo.ALARMINFO = "超载报警";
- break;
- default:
- agvinfo.ALARMCODE = "256";
- agvinfo.ALARMINFO = "未知异常";
- break;
- #endregion
- }
- if (agvdata[6] != 0)
- {
- agvinfo.RUNSTATUS = int.Parse(agvinfo.ALARMCODE) - 1;
- }
- //速度等级
- int SpeedGrade = (int)agvdata[7];
- if (SpeedGrade > 0 && SpeedGrade < 6)
- {
- agvinfo.SPEEDLEVEL = SpeedGrade;
- }
- Analyze(agvinfo);
- }
- else if(agvinfo.FPS==2)
- {
- int BatteryEleInt = (int)(agvdata[5] << 8 | agvdata[6]);
- // int BatteryEleDecimal = (int)agvdata[5];
- int BatteryPowInt = (int)agvdata[7];
- if (((decimal)BatteryEleInt) / 100 <= 200)
- {
- agvinfo.Battery_Electricity = ((decimal)BatteryEleInt) / 100;
- }
- agvinfo.Battery_Power = (decimal)BatteryPowInt;
- }
- else if (agvinfo.FPS == 3)
- {
- int BatteryVolInt = (int)((agvdata[5] << 4) | (agvdata[6]>>4));
- agvinfo.Bttery_Voltage = ((decimal)BatteryVolInt)/100;
- int BatteryTemInt = (int)(((agvdata[6]&0x0F) << 8) | (agvdata[7]));
- agvinfo.Battery_Temperature = ((decimal)BatteryTemInt) / 100;
- }
-
- agvinfo.OffLineCount = 0;
- agvinfo.ConnectStatus = true;
- #endregion
- }
- }
- else
- {
- ArrangeBuffer(receiveBuffer, frameHead);
- }
- }
- else if ((receiveBuffer[0] == frameHead) && (receiveBuffer.Count >= 10) && receiveBuffer[1] == 0x62)
- {
- byte checkSum = 0x00;
- for (int i = 0; i < 8; i++)
- {
- checkSum ^= receiveBuffer[i];
- }
- if (checkSum == receiveBuffer[8] && frameTaig == receiveBuffer[9])
- {
- byte[] agvdata = new byte[10];
- for (int i = 0; i < 10; i++)
- {
- agvdata[i] = receiveBuffer[i];
- }
- lock (portLock)
- {
- receiveBuffer.RemoveRange(0, 10);
- }
- //解析旧协议
- int agvnum = agvdata[2];
- if (GlobalPara.AgvInfoDic.ContainsKey(agvnum))
- {
- #region 属性更新
- AGVInfoModel agvinfo = GlobalPara.AgvInfoDic[agvnum];
- agvinfo.AGVNUM = agvnum;
- agvinfo.MARKNUM = Convert.ToInt16(agvdata[3] | ((agvdata[7] & 0xC0) << 2));
- agvinfo.ROUTENUM = agvdata[6];
- if (agvdata[4] > 0 && agvdata[4] < 32)
- {
- agvinfo.MARKFUN = agvdata[4];
- }
- agvinfo.RUNSTATUS = agvdata[5];
- //报警信息处理
- switch (agvdata[5])
- {
- #region 异常分类
- case 1:
- agvinfo.ALARMCODE = "1";
- agvinfo.ALARMINFO = "无异常";
- break;
- case 2:
- agvinfo.ALARMCODE = "2";
- agvinfo.ALARMINFO = "急停报警";
- break;
- case 3:
- agvinfo.ALARMCODE = "3";
- agvinfo.ALARMINFO = "防撞报警";
- break;
- case 4:
- agvinfo.ALARMCODE = "4";
- agvinfo.ALARMINFO = "牵引棒报警";
- break;
- case 5:
- agvinfo.ALARMCODE = "5";
- agvinfo.ALARMINFO = "障碍物";
- break;
- case 6:
- agvinfo.ALARMCODE = "6";
- agvinfo.ALARMINFO = "跑错路线";
- break;
- case 7:
- agvinfo.ALARMCODE = "7";
- agvinfo.ALARMINFO = "电压报警";
- break;
- case 8:
- agvinfo.ALARMCODE = "8";
- agvinfo.ALARMINFO = "脱轨报警";
- break;
- case 9:
- agvinfo.ALARMCODE = "9";
- agvinfo.ALARMINFO = "低电压报警";
- break;
- case 10:
- agvinfo.ALARMCODE = "10";
- agvinfo.ALARMINFO = "低电压停机";
- break;
- case 11:
- agvinfo.ALARMCODE = "11";
- agvinfo.ALARMINFO = "超载报警";
- break;
- default:
- agvinfo.ALARMCODE = "-1";
- agvinfo.ALARMINFO = "未知异常";
- break;
- #endregion
- }
- //速度等级
- int SpeedGrade = agvdata[7] & 0x3F;
- if (SpeedGrade > 0 && SpeedGrade < 6)
- {
- agvinfo.SPEEDLEVEL = SpeedGrade;
- }
- agvinfo.OffLineCount = 0;
- agvinfo.ConnectStatus = true;
- Analyze(agvinfo);
- #endregion
- }
- }
- else
- {
- ArrangeBuffer(receiveBuffer, frameHead);
- }
- }
- else
- {
- ArrangeBuffer(receiveBuffer, frameHead);
- }
- }
- }
- public void Analyze(AGVInfoModel agvinfo)
- {
- string a = "";
- // if (agvdata.Count >= 10)
- {
-
-
- #region 管制区逻辑处理部分
- TrafficAreaService trafficService = new TrafficAreaService();
- //前管制区号
- //拷贝一份另存为
- if (agvinfo.PTRAFFICNUM != agvinfo.TRAFFICNUM)
- {
- agvinfo.PTRAFFICNUM.Clear();
- agvinfo.PTRAFFICNUM.AddRange(agvinfo.TRAFFICNUM);
- }
- //最新管制区号
- //获取当前地标位置是否在管制区内
- List<TrafficAreaModel> newTrafficList = trafficService.GetTrafficList(agvinfo.MARKNUM, agvinfo.ROUTENUM, agvinfo.AGVNUM);
- List<TrafficAreaModel> outTrafficList = new List<TrafficAreaModel>();
- outTrafficList.AddRange(agvinfo.PTRAFFICNUM);
- bool isChange = CheckChange(agvinfo.TRAFFICNUM, newTrafficList);
- //检查旧管制区与新管制区是否有变化,有变化才需要检查AGV的管制状态的逻辑变化。
- if (isChange)
- {
- #region 管制区数据更新
- if (newTrafficList.Count > 0)
- {
- #region 标明进入了管制区(交叉管制区或独立管制区)
- {
- foreach (TrafficAreaModel traffic in newTrafficList)
- {
- //添加AGV的管制区对象列表
- if (!agvinfo.TRAFFICNUM.Contains(traffic))
- {
- //添加最新的管制区
- agvinfo.TRAFFICNUM.Add(traffic);
- //管制区有AGV进入
- traffic.AGVINTER(agvinfo, false);
- }
- if (outTrafficList.Contains(traffic))
- {
- outTrafficList.Remove(traffic);
- }
- }
- }
- //循环把AGV已经退出的管制区给处理一下。
- foreach (TrafficAreaModel traffic in outTrafficList)
- {
- //管制区有AGV离开
- agvinfo.TRAFFICNUM.Remove(traffic);
- traffic.AGVLEAVE(agvinfo);
- if (traffic.listAgvQueue.Count > 0)
- {
- traffic.ReleaseAgv(); //调用放行事件
- }
- }
- #endregion
- }
- else
- {
- #region 表示AGV现在不在任何管制区
- foreach (TrafficAreaModel traffic in outTrafficList)
- {
- agvinfo.TRAFFICNUM.Remove(traffic);
- traffic.AGVLEAVE(agvinfo);
- if (traffic.listAgvQueue.Count > 0)
- {
- traffic.ReleaseAgv(); //调用放行事件
- }
- }
- if (agvinfo.TrafficFlag)
- {
- agvinfo.TrafficFlag = false;
- agvinfo.TRAFFICAGV = null;
- }
- #endregion
- }
- #endregion
- #region 管制区的数据更新后,判定AGV的管制状态
- //AGV只有在所有管制区成为主机的情况下,才能不被管制
- bool isTraffic = false;//标识AGV是否应该被管制,true表示应该不管制;false表示不应该不管制
- //int agv=0;
- #region 遍历AGV现在的管制区,寻找是否有某个管制区还管制着本AGV(我自己)
- foreach (var traffic in agvinfo.TRAFFICNUM)
- {
- //一旦发现AGV在某个管制区还不是主机,则把AGV管制住
- if (agvinfo != traffic.MainAgv)
- {
- if (traffic.listAgvQueue.Contains(traffic.MainAgv))
- {
- traffic.MainAgv = agvinfo;
- agvinfo.TrafficFlag = false;
- isTraffic = false;
- break;
- }
- else
- {
- isTraffic = true;
- agvinfo.TRAFFICAGV = traffic.MainAgv;//---LG修改方便查看主机
- break;
- }
- }
- }
- #endregion
- #region 发现AGV需要被管制
- if (isTraffic)
- {
- agvinfo.TrafficFlag = true;
- }
- else
- {
- agvinfo.TrafficFlag = false;
- agvinfo.TRAFFICAGV = null;
- foreach (var traffic in outTrafficList)
- {
- if (traffic.MainAgv != null)
- {
- traffic.ReleaseMainAgv();
- }
- else
- {
- if (traffic.listAgvQueue.Count > 0)
- {
- traffic.ReleaseAgv(traffic.listAgvQueue[0]);
- }
- }
- }
- }
- #endregion
- #endregion
- #region 管制区数据更新日志记录
- //StringBuilder a1 = new StringBuilder();
- //foreach (var n in agvinfo.TRAFFICNUM)
- //{
- // a1.Append("->"+n.TrafficNum);
- //}
- //if (a1.Length > 1)
- //{
- // a1.Remove(0, 2);
- // a1.Append("|");
- //}
- //else
- //{
- // a1.Append("无");
- //}
- //string marktime = DateTime.Now.ToString("HH:mm:ss");
- //a = string.Format("{5} : AGV编号:{0} --AGV管制状态:{1} --当前地标:{2} --当前路线:{3} --当前管制区:{4} --当前AGV管制区主机:{6}", agvinfo.AGVNUM, agvinfo.TrafficFlag, agvinfo.MARKNUM, agvinfo.ROUTENUM, a1, marktime,agvinfo.TRAFFICAGV);
- //ErrorLog.WriteErrorLogagv(a);
- #endregion
- }
- #endregion
- #region 罗国--预防管制区只有一辆车还被管制住。
- bool SigleFlag = false;
- bool SigleFlag1 = false;
- if (agvinfo.TrafficFlag)
- {
- foreach (var agvtrffic in agvinfo.TRAFFICNUM)
- {
- if (agvinfo.TRAFFICAGV == null)//没有主机的时候不放行
- {
- if (agvtrffic.listAgvQueue.Count == 0)
- {
- SigleFlag = true;
- }
- else if (agvtrffic.listAgvQueue.Count == 1)
- {
- if (agvtrffic.listAgvQueue[0] == agvinfo)
- {
- SigleFlag = true;
- }
- }
- else
- {
- SigleFlag = false;
- break;
- }
- }
- else//有主机不放行
- {
- foreach (var agvtraffic1 in agvinfo.TRAFFICAGV.TRAFFICNUM)
- {
- if (agvtraffic1 == agvtrffic)//有相同的区域
- {
- SigleFlag1 = false;
- break;
- }
- else
- {
- SigleFlag1 = true;
- }
- }
- if (!SigleFlag1)
- {
- break;
- }
- }
- }
- if (SigleFlag)//确定只有一台AGV把AGV
- {
- agvinfo.TrafficFlag = false;
- foreach (var traffic1 in agvinfo.TRAFFICNUM)//清空队列中所有的AGV
- {
- traffic1.MainAgv = agvinfo;
- if (traffic1.listAgvQueue.Contains(agvinfo))
- {
- traffic1.listAgvQueue.Remove(agvinfo);
- }
- }
- }
- if (SigleFlag1)//有主机的处理,且主机不在管制区域内
- {
- agvinfo.TrafficFlag = false;
- foreach (var traffic2 in agvinfo.TRAFFICNUM)//清空队列中AGV的主机
- {
- traffic2.MainAgv = agvinfo;
- if (traffic2.listAgvQueue.Contains(agvinfo.TRAFFICAGV))
- {
- traffic2.listAgvQueue.Remove(agvinfo.TRAFFICAGV);
- }
- }
- }
- }
- #endregion
- #region 罗国--预防多管制区里互相管制
- if (agvinfo.TrafficFlag)//在被管制的前提下
- {
- if (agvinfo.TRAFFICNUM.Count >= 2)//在多个管制区的互相管制随机放行
- {
- if (agvinfo.TRAFFICAGV.TRAFFICAGV == agvinfo)//主机的主机等于主机说明互相管制了
- {
- agvinfo.TrafficFlag = false;
- foreach (var traffic1 in agvinfo.TRAFFICNUM)//清空队列中所有的AGV
- {
- traffic1.MainAgv = agvinfo;
- if (traffic1.listAgvQueue.Contains(agvinfo))
- {
- traffic1.listAgvQueue.Remove(agvinfo);
- }
- if (traffic1.listAgvQueue.Contains(agvinfo.TRAFFICAGV))//把被管制的agv放在各个管制区的队列第一位
- {
- traffic1.listAgvQueue.Remove(agvinfo.TRAFFICAGV);
- traffic1.listAgvQueue.Insert(0, agvinfo.TRAFFICAGV);
- }
- }
- }
- }
- }
- #endregion
- #region 避免关机重启后管制状态还保留,导致放行不了
- if (agvinfo.TRAFFICNUM.Count == 0)
- {
- agvinfo.TrafficFlag = false;
- agvinfo.TRAFFICAGV = null;
- }
- #endregion
- #region 在管制区中平行的时候就不管制了
- if (GlobalPara.IsEnablePallel)
- {
- agvinfo.ParallelFlag = CheckRouteFlag(agvinfo.MARKNUM, agvinfo.ROUTENUM, agvinfo.AGVNUM);//实时检查AGV所在的地标和路线是否处于平行的时候
- agvinfo.Direction = CheckDirectionFlag(agvinfo.MARKNUM, agvinfo.ROUTENUM, agvinfo.AGVNUM);//实时检查AGV所在路线上的放向
- if (agvinfo.TrafficFlag)
- {
- bool falg1 = false;
- bool falg2 = false;
- int indexrow = 0;
- for (int j = 0; j < agvinfo.TRAFFICNUM.Count; j++)
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv != null)//如果等零的话
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv != agvinfo)
- {
- if (agvinfo.ParallelFlag && agvinfo.TRAFFICNUM[j].MainAgv.ParallelFlag)
- {
- falg1 = true;
- }
- else
- {
- falg1 = false;
- break;
- }
- }
- }
- }
- for (int j = 0; j < agvinfo.TRAFFICNUM.Count; j++)
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv != null)//如果等零的话
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv != agvinfo)
- {
- for (int i = 0; i < agvinfo.Direction.Count; i++)
- {
- if (agvinfo.TRAFFICNUM[j].MainAgv.Direction.Contains(agvinfo.Direction[i]))//方向相同则放行
- {
- falg2 = true;
- break;
- }
- else
- {
- falg2 = false;
- }
- }
- }
- }
- }
- if (falg1 && falg2)//只有是平行线且方向一致时才不管制
- {
- agvinfo.TrafficFlag = false;
- for (int i = 0; i < agvinfo.TRAFFICNUM.Count; i++)
- {
- if (agvinfo.TRAFFICNUM[i].listAgvQueue.Contains(agvinfo))
- {
- agvinfo.TRAFFICNUM[i].listAgvQueue.Remove(agvinfo);
- agvinfo.TRAFFICNUM[i].listAgvQueue.Insert(0, agvinfo);//把放行的agv排到队列前面
- }
- }
- }
- }
- }
- #endregion
- }
-
- }
- }
- }
|