DCSysMG.cpp 95 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377
  1. #include "pch.h"
  2. #include "DCSysMG.h"
  3. #include <fstream>
  4. #include <string>
  5. #include <iomanip>
  6. constexpr auto RAILWAY_DISTANCE_ALLEXCURSION = -1;
  7. DCSysMG::DCSysMG(void)
  8. {
  9. p_PQValueArr=nullptr;
  10. NodeIDsCount=1000;
  11. NodeIndex=0;
  12. m_nMaxSigleArrowTrainNums = Max_SigleArrowTrain_Nums;
  13. m_nAllPowerStationNums = All_Power_Station_Nums;
  14. // m_bInit = false;
  15. }
  16. void DCSysMG::ExitInstance()
  17. {
  18. m_PowerStationNodeMap.clear();
  19. TrainSInStationMap.clear();
  20. m_NetTracksRelationMap.clear();
  21. m_TouchNetSpanNetInfo.clear();
  22. m_StationDataList.clear(); //车站信息
  23. m_RunDataList.clear(); //行车运行信息
  24. m_StationInfoVector.clear();
  25. m_DCFixNodesMap.clear(); //直流固定节点表
  26. m_DownFixRunDataList.clear();
  27. m_ShortCutAreaTrians.clear();
  28. m_DCNodesMap.clear();
  29. TouchNetMap.clear();
  30. p_PQValueArr=nullptr;
  31. }
  32. DCSysMG::~DCSysMG(void)
  33. {
  34. ExitInstance();
  35. }
  36. void DCSysMG::SetPQValueArr(DCNodePQValue PQValueArr[]) //、设置直流PQ矩阵的值,其中包括直流的相关的计算
  37. {
  38. p_PQValueArr=PQValueArr;
  39. }
  40. void DCSysMG::SetRunStatus(int status) //设置运行状态
  41. {
  42. m_RunStatus = status;
  43. }
  44. size_t DCSysMG::GetStationSize()
  45. {
  46. return m_StationDataList.size();
  47. }
  48. bool DCSysMG::GetStationByindex(int index,TrainRuningData &station) //根据索引、车站信息列表获取对应的车站信息
  49. {
  50. if (index>=0&&index<m_StationDataList.size())
  51. {
  52. station = m_StationDataList[index];
  53. return true;
  54. }
  55. return false;
  56. }
  57. void DCSysMG::AddStationData(TrainRuningData &station) //添加车站数据
  58. {
  59. m_StationDataList.push_back(station);
  60. }
  61. void DCSysMG::AddStationInfo(Dc_PowerStation& station) //添加车站信息,车站ID与车站名
  62. {
  63. m_PowerStationNodeMap.insert(make_pair(station.GetID(),station));
  64. }
  65. void DCSysMG::AddStationTo(int index,TrainRuningData &station) ///增加车站信息到车站数据表,在对应的索引上添加车站信息
  66. {
  67. m_StationDataList.insert(m_StationDataList.begin()+index,station);
  68. }
  69. int DCSysMG::CreateNodeID() //生成节点的ID号
  70. {
  71. NodeIDsCount++;
  72. DCYSNODEMAP::iterator iter = m_DCFixNodesMap.find(NodeIDsCount);
  73. if (iter!=m_DCFixNodesMap.end())
  74. return -1;
  75. else
  76. return NodeIDsCount;
  77. }
  78. void DCSysMG::AdjustTouchNetRelation(string touchnetid,Track_Section& tracksec)//根据接触网ID和轨道区段调整接触网与轨道的关系
  79. {
  80. TOUCHNETRELAMAP::iterator iter = m_NetTracksRelationMap.find(touchnetid);
  81. if (iter!=m_NetTracksRelationMap.end())
  82. {
  83. iter->second.TrackSecsMap.insert(make_pair(tracksec.TrackID,tracksec)); //在对应信息列表中找到对应的touchnetid,则将tracksec与touchnetid关联
  84. //make_pair():creates a pair structure that contains two data elements of any type
  85. }
  86. else //在对应信息列表中未找到对应的touchnetid,则新建一个touchnetid节点再将tracksec与touchnetid关联
  87. {
  88. TouchNet_Track_Relation touchrelation;
  89. touchrelation.TouchNetID = touchnetid;
  90. touchrelation.TrackSecsMap.insert(make_pair(tracksec.TrackID,tracksec));
  91. m_NetTracksRelationMap.insert(make_pair(touchnetid,touchrelation));
  92. }
  93. }
  94. double DCSysMG::GetTouchNetDurDistance(string startline,double exs,string endline,double exe,int arrow)//获取接触网的距离信息
  95. {
  96. double len=0;
  97. string curtouchnet = startline;
  98. if (startline==endline) //若站间只由一段接触网组成,且当前接触网只对应一段轨道区段 xyx注释
  99. {
  100. len=exe-exs; //终点与起点之差(一个区段的长度)
  101. }
  102. TOUCHNETMAP::iterator iterstart = TouchNetMap.find(startline);
  103. while(iterstart!=TouchNetMap.end()&&iterstart->first!=endline) //起点与终点不重合 //若站间由多段接触网组成,且各段接触网对应多段轨道区段 xyx注释
  104. {
  105. if (iterstart->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet)
  106. {
  107. CElectricEqpmt_Line_TouchNet* pnet = iterstart->second;
  108. len+=GetTouchLenght(pnet->GetEqpmentID()); //获取接触网的长度
  109. iterstart = TouchNetMap.find(pnet->GetNextTouchNet());
  110. }
  111. }
  112. return len;
  113. }
  114. void DCSysMG::SetHeadTailTouchNet(int arrow,int headtail,string id) ///设置接触网的头尾点
  115. {
  116. if (arrow==TRAIN_DIR_DOWN)//列车下行运行方向
  117. {
  118. if (headtail==TRAIN_DIR_HEAD)
  119. {
  120. DownStartTouchNetID=id;
  121. }
  122. else if (headtail==TRAIN_DIR_TAIL)
  123. {
  124. DownEndtouchNetID =id;
  125. }
  126. }
  127. else if (arrow==TRAIN_DIR_UP)
  128. {
  129. if (headtail==TRAIN_DIR_HEAD)
  130. {
  131. UpStartTouchNetID=id;
  132. }
  133. else if (headtail==TRAIN_DIR_TAIL)
  134. {
  135. UpEndTouchNetID =id;
  136. }
  137. }
  138. }
  139. bool DCSysMG::CreateTailNodes() //尾节点的生成并对其初始化
  140. {
  141. //上行轨道尾节点 xyx注释
  142. UpTailNodeID = CreateNodeID(); //上行尾节点
  143. if (UpTailNodeID<0)
  144. {
  145. return false;
  146. }
  147. HEADTAIL Node3;
  148. Node3.Init(NodeIndex,UpTailNodeID,Dc_NodeKind_UPTail);
  149. NodeIndex++;
  150. POWERNODE PowerNode3; //电力节点
  151. PowerNode3.setHeadTail(&Node3); //尾节点与电力节点关联
  152. m_DCFixNodesMap.insert(make_pair(UpTailNodeID,PowerNode3)); //将生成的电力节点添加到固定节点列表中
  153. //下行轨道尾节点 xyx注释
  154. DownTailNodeID = CreateNodeID();
  155. if (DownTailNodeID<0)
  156. {
  157. return false;
  158. }
  159. HEADTAIL Node4;
  160. Node4.Init(NodeIndex,DownTailNodeID,Dc_NodeKind_DownTail);
  161. NodeIndex++;
  162. POWERNODE PowerNode4;
  163. PowerNode4.setHeadTail(&Node4);
  164. m_DCFixNodesMap.insert(make_pair(DownTailNodeID,PowerNode4));
  165. return true;
  166. }
  167. void DCSysMG::PushTailNodes() //保存节点数据
  168. {
  169. LineNodeData nodeup; //上行线节点数据
  170. nodeup.ID = UpTailNodeID;
  171. nodeup.Kind = Dc_NodeKind_UPTail;
  172. nodeup.TouchNetID = UpEndTouchNetID;
  173. nodeup.excursion = GetTouchLenght(UpEndTouchNetID);
  174. m_UpRunFixDataList.push_back(nodeup);
  175. LineNodeData nodedown; //下行线节点数据
  176. nodedown.ID = DownTailNodeID;
  177. nodedown.Kind = Dc_NodeKind_DownTail;
  178. nodedown.TouchNetID = DownEndtouchNetID;
  179. nodedown.excursion = GetTouchLenght(DownEndtouchNetID);
  180. m_DownFixRunDataList.push_back(nodedown);
  181. }
  182. bool DCSysMG::CreateHeadNodes() //生成头节点,并初始化头节点数据(类似于CreateTailNodes、PushTailNodes两函数的功能)
  183. {
  184. //上行轨道头节点 xyx注释
  185. UpHeadNodeID = CreateNodeID();
  186. if (UpHeadNodeID<0)
  187. {
  188. return false;
  189. }
  190. HEADTAIL Node1;
  191. Node1.Init(NodeIndex,UpHeadNodeID,Dc_NodeKind_UPHead);
  192. NodeIndex++;
  193. POWERNODE PowerNode1;
  194. PowerNode1.setHeadTail(&Node1);
  195. m_DCFixNodesMap.insert(make_pair(UpHeadNodeID,PowerNode1));
  196. //下行轨道头节点 xyx注释
  197. DownHeadNodeID = CreateNodeID();
  198. if (DownHeadNodeID<0)
  199. {
  200. return false;
  201. }
  202. HEADTAIL Node2;
  203. Node2.Init(NodeIndex,DownHeadNodeID,Dc_NodeKind_DownHead);
  204. NodeIndex++;
  205. POWERNODE PowerNode2;
  206. PowerNode2.setHeadTail(&Node2);
  207. m_DCFixNodesMap.insert(make_pair(DownHeadNodeID,PowerNode2));
  208. //上行接触网头节点 xyx注释
  209. LineNodeData nodeup;
  210. nodeup.ID = UpHeadNodeID;
  211. nodeup.Kind = Dc_NodeKind_UPHead;
  212. nodeup.TouchNetID = UpStartTouchNetID;
  213. nodeup.excursion = 0;
  214. m_UpRunFixDataList.push_back(nodeup);
  215. //下行接触网头节点 xyx注释
  216. LineNodeData nodedown;
  217. nodedown.ID = DownHeadNodeID;
  218. nodedown.Kind = Dc_NodeKind_DownHead;
  219. nodedown.TouchNetID = DownStartTouchNetID;
  220. nodedown.excursion = 0;
  221. m_DownFixRunDataList.push_back(nodedown);
  222. return true;
  223. }
  224. bool DCSysMG::AddSpanNetInfo(int station,int errorid,int arrow) //增加跨网信息
  225. {
  226. m_CritilSecSpanNet.lock();
  227. TouchNet_SpanNetApplyPower_Info span; //接触网跨网供电信息
  228. span.arrow=arrow;
  229. span.errorid=errorid;
  230. span.stationid = station;
  231. DCSTATIONMAP::iterator iter = m_PowerStationNodeMap.find(station);
  232. if (iter == m_PowerStationNodeMap.end())
  233. {
  234. m_CritilSecSpanNet.unlock();
  235. return false;
  236. }
  237. span.nodeid = iter->second.GetRectierToTouchNetNodeID();
  238. m_TouchNetSpanNetInfo.push_back(span);
  239. m_CritilSecSpanNet.unlock();
  240. return true;
  241. }
  242. bool DCSysMG::RemoveSpanNetInfo(int station,int errorid,int arrow) //删除跨网信息
  243. {
  244. bool ret=false;
  245. m_CritilSecSpanNet.lock();
  246. for (size_t i=0;i<m_TouchNetSpanNetInfo.size();i++)
  247. {
  248. if (m_TouchNetSpanNetInfo[i].stationid=station&& arrow == m_TouchNetSpanNetInfo[i].arrow)
  249. {
  250. m_TouchNetSpanNetInfo.erase(m_TouchNetSpanNetInfo.begin()+i);
  251. ret=true;
  252. break;
  253. }
  254. }
  255. m_CritilSecSpanNet.unlock();
  256. return ret;
  257. }
  258. bool DCSysMG::CreateRectierToTouchNetNode(Dc_PowerStation& Station) //生成整流器到接触网节点,并对其初始化
  259. {
  260. //创建直流正极母线节点 xyx注释
  261. RECTIERTOTOUCHNET Node;
  262. int NodeID = CreateNodeID();
  263. if (NodeID<0)
  264. return false;
  265. POWERNODE PowerNode; //电节点定义及其初始化
  266. ELEEQPMTMAP::iterator iterRectierToTouchNet =ElectricEqpmtMap.find(Station.GetRectierToTouchNetUnitID());
  267. if (iterRectierToTouchNet!=ElectricEqpmtMap.end())
  268. {
  269. if (!iterRectierToTouchNet->second->GetPower())
  270. {
  271. Node.SetPower(false);
  272. //PowerNode.m_NodeV=0.0;
  273. }
  274. }
  275. Node.Init(NodeIndex,NodeID,Dc_NodeKind_RectierToTouchNet);
  276. NodeIndex++;
  277. Node.StationID = Station.GetID(); //将车站ID设置为整流器到接触网的ID
  278. Station.SetRectierToTouchNetNodeID(NodeID); //将整流器到接触网的ID设置为车站的ID
  279. Node.SetTouchLineLen(Station.GetUpPreLineLen(),Station.GetDownPreLineLen(),Station.GetUpNextLineLen(),Station.GetDownNextLineLen()); //设置接触网的长度
  280. //整流器到接触网的节点,应有上行与下行,在这里为什么只创建一个节点,但是在后面创建了上下行节点,其上下行节点ID均为NodeID,实现原理?
  281. double upprenodelinelen; //当前站上行前一节点接触网长度(上行:前一站与当前站间的接触网长度) xyx注释
  282. double downprenodelinelen; //当前站下行前一节点接触网长度(下行:前一站与当前站间的接触网长度) xyx注释
  283. //设置当前站与前一站间直流正极母线节点的相关信息 xyx注释
  284. DCSTATIONMAP::iterator iter1=m_PowerStationNodeMap.find(Station.GetPreStationID()); //获取Station前一车站的ID
  285. int n5 = Station.GetPreStationID();
  286. if (iter1!=m_PowerStationNodeMap.end())
  287. {
  288. upprenodelinelen = GetTouchNetDurDistance(iter1->second.GetUpTouchNetID(),0,Station.GetUpTouchNetID(),0,TRAIN_DIR_UP); //获取Station前一车站对应的上行接触网的长度
  289. downprenodelinelen = GetTouchNetDurDistance(iter1->second.GetDownTouchNetID(),0,Station.GetDownTouchNetID(),0,TRAIN_DIR_DOWN); //获取Station前一车站对应的下行接触网的长度
  290. DCYSNODEMAP::iterator iter2 = m_DCFixNodesMap.find(iter1->second.GetRectierToTouchNetNodeID()); //获取Station前一车站对应的整流器到接触网的ID
  291. if (iter2!=m_DCFixNodesMap.end())
  292. {
  293. POWERNODE& PowerNode = iter2->second;
  294. PowerNode.RectierToTouchNetNode.SetUpNextNode(NodeID,upprenodelinelen,Node.GetPower()); //将当前站的直流正极母线作为前一站的上行后一节点,并赋予节点编号及接触网长度 xyx注释
  295. PowerNode.RectierToTouchNetNode.SetDownNextNode(NodeID,downprenodelinelen,Node.GetPower()); //将当前站的直流正极母线作为前一站的下行后一节点,并赋予节点编号及接触网长度 xyx注释
  296. }
  297. else
  298. return false;
  299. Node.SetUpPreNode(iter1->second.GetRectierToTouchNetNodeID(),upprenodelinelen,iter2->second.RectierToTouchNetNode.GetPower()); //将前一站的直流正极母线作为当前站的上行前一节点,并赋予节点编号及接触网长度 xyx注释
  300. Node.SetDownPreNode(iter1->second.GetRectierToTouchNetNodeID(),downprenodelinelen,iter2->second.RectierToTouchNetNode.GetPower()); //将前一站的直流正极母线作为当前站的下行前一节点,并赋予节点编号及接触网长度 xyx注释
  301. }
  302. //将当前车站的直流正极母线节点作为上行接触网节点添加至上行固定节点m_UpRunFixDataList中 xyx注释
  303. LineNodeData nodeup; //整流器到上行接触网的节点 上行接触线节点数据及其初始化
  304. nodeup.ID = NodeID;
  305. nodeup.Kind = Dc_NodeKind_RectierToTouchNet;
  306. nodeup.TouchNetID = Station.GetUpTouchNetID();
  307. nodeup.excursion = 0;
  308. m_UpRunFixDataList.push_back(nodeup); //节点信息添加到上行固定节点列表信息中
  309. //将当前车站的直流正极母线节点作为下行接触网节点添加至下行固定节点m_DownFixRunDataList中 xyx注释
  310. LineNodeData nodedown; //整流器到下行接触网的节点
  311. nodedown.ID = NodeID;
  312. nodedown.Kind = Dc_NodeKind_RectierToTouchNet;
  313. nodedown.TouchNetID = Station.GetDownTouchNetID();
  314. nodedown.excursion = 0;
  315. m_DownFixRunDataList.push_back(nodedown);
  316. //将当前车站的直流正极母线节点添加至POWERNODE及直流固定节点m_DCFixNodesMap中 xyx注释
  317. PowerNode.setRectierToTouchNet(&Node);
  318. m_DCFixNodesMap.insert(make_pair(NodeID,PowerNode)); //再将整流器到接触网的节点添加到固定节点列表中
  319. //make_pair(*,*)其中的参数根据调用对像进行确定,要求所传参数与调用对象一致,但是其中的参数比较灵活
  320. return true;
  321. }
  322. bool DCSysMG::CreateRectierToRailWayNode(Dc_PowerStation& Station) //生成整流器到轨道节点并对其进行初始化
  323. {
  324. RECTIERTORAILWAY pNode; //整流器到轨道节点 //根据程序及图例推理:此节点为整流器节点(2016.03.18),根据字面理解就是一个坑啊
  325. int NodeID = CreateNodeID();
  326. if (NodeID<0)
  327. return false;
  328. POWERNODE PowerNode; //电节点定义及其初始化
  329. ELEEQPMTMAP::iterator iterRectierToRailway =ElectricEqpmtMap.find(Station.GetRectierToRailwayUnitID());
  330. if (iterRectierToRailway!=ElectricEqpmtMap.end())
  331. {
  332. if (!iterRectierToRailway->second->GetPower())
  333. {
  334. pNode.SetPower(false);
  335. //PowerNode.m_NodeV=0.0;
  336. }
  337. }
  338. pNode.Init(NodeIndex,NodeID,Dc_NodeKind_RectierToRailWay);
  339. NodeIndex++;
  340. pNode.StationID=Station.GetID();
  341. Station.SetRectierToRailwayNodeID(NodeID);
  342. //pNode.SetInnerNode(Station.GetRectierToTouchNetNodeID(),Station.GetInnerR()); //将当前站的直流正极母线节点作为负极母线节点的内节点并赋予内阻参数 xyx注释
  343. pNode.SetFeedBackLineLen(Station.GetUpFeedBackLineLen(),Station.GetDownFeedBackLen()); //将当前站的2条回流线长度赋给负极母线节点的回流线 xyx注释
  344. DCYSNODEMAP::iterator iter2 = m_DCFixNodesMap.find(Station.GetRectierToTouchNetNodeID()); //在固定节点列表中查找Station车站的整流器到接触网的节点是否存在
  345. if (iter2!=m_DCFixNodesMap.end())
  346. {
  347. POWERNODE& PowerNode = iter2->second;
  348. PowerNode.RectierToTouchNetNode.SetInnerNode(NodeID,Station.GetInnerR(),pNode.GetPower()); //将当前站的直流负极母线节点作为正极母线节点的内节点并赋予内阻参数 xyx注释
  349. pNode.SetInnerNode(Station.GetRectierToTouchNetNodeID(),Station.GetInnerR(),PowerNode.RectierToTouchNetNode.GetPower()); //将当前站的直流正极母线节点作为负极母线节点的内节点并赋予内阻参数 xyx注释
  350. }
  351. else
  352. return false;
  353. //将当前负极母线节点添加至POWERNODE及直流固定节点m_DCFixNodesMap中 xyx注释
  354. PowerNode.setRectierToRailway(&pNode);
  355. m_DCFixNodesMap.insert(make_pair(NodeID,PowerNode));
  356. return true;
  357. }
  358. bool DCSysMG::CreateRailWayNode(Dc_PowerStation& Station) // 生成轨道节点并对其进行初始化 //根据程序及图例推理(2016.03.18):此节点为整流器到轨道的节点(包括上行轨道节点、下行轨道节点)
  359. {
  360. RAILWAY pUpNode; //上行轨道节点
  361. int UpNodeID = CreateNodeID();
  362. if (UpNodeID<0)
  363. return false;
  364. pUpNode.Init(NodeIndex,UpNodeID,Dc_NodeKind_RailWay);
  365. NodeIndex++;
  366. pUpNode.StationID=Station.GetID();
  367. pUpNode.SetFeedBackLineLen(Station.GetUpFeedBackLineLen());
  368. Station.SetUpRailwayNodeID(UpNodeID);
  369. //将直流负极母线设为当前上行轨道节点的关联节点,并赋予上行回流线长度 xyx注释
  370. //pUpNode.SetRectierNode(Station.GetRectierToRailwayNodeID(),Station.GetUpFeedBackLineLen()); //根据程序及图例推理(2016.03.18):将整流器节点设为上行轨道节点的关系节点
  371. RAILWAY pDownNode; //下行轨道节点
  372. int DownNodeID = CreateNodeID();
  373. if (DownNodeID<0)
  374. return false;
  375. pDownNode.Init(NodeIndex,DownNodeID,Dc_NodeKind_RailWay);
  376. NodeIndex++;
  377. pDownNode.StationID=Station.GetID();
  378. pDownNode.SetFeedBackLineLen(Station.GetDownFeedBackLen());
  379. Station.SetDownRailwayNodeID(DownNodeID);
  380. //将直流负极母线设为当前下行轨道节点的关联节点,并赋予下行回流线长度 xyx注释
  381. //pDownNode.SetRectierNode(Station.GetRectierToRailwayNodeID(),Station.GetDownFeedBackLen()); //设置与下行轨道节点相关的参数信息
  382. DCYSNODEMAP::iterator iter = m_DCFixNodesMap.find(Station.GetRectierToRailwayNodeID()); //在车站信息列表中查找是否有Station车站的整流器到轨道的节点
  383. int n8 = Station.GetRectierToRailwayNodeID();
  384. if (iter!=m_DCFixNodesMap.end())
  385. {
  386. POWERNODE& PowerNode = iter->second;
  387. PowerNode.RectierToRailwayNode.SetUpNode(UpNodeID,Station.GetUpFeedBackLineLen(),true);//将当前上行轨道节点设置为直流负极母线的关系节点,并赋予上行回流长度 xyx注释
  388. PowerNode.RectierToRailwayNode.SetDownNode(DownNodeID,Station.GetDownFeedBackLen(),true);//将当前下行轨道节点设置为直流负极母线的关系节点,并赋予下行回流长度 xyx注释
  389. //xyx修改
  390. pUpNode.SetRectierNode(Station.GetRectierToRailwayNodeID(),Station.GetUpFeedBackLineLen(),PowerNode.RectierToRailwayNode.GetPower()); //根据程序及图例推理(2016.03.18):将整流器节点设为上行轨道节点的关系节点
  391. pDownNode.SetRectierNode(Station.GetRectierToRailwayNodeID(),Station.GetDownFeedBackLen(),PowerNode.RectierToRailwayNode.GetPower()); //设置与下行轨道节点相关的参数信息
  392. }
  393. else
  394. return false;
  395. //设置前一站与当前站间的轨道长度 xyx注释
  396. double UpRailWayLen=0;
  397. double DownRailWayLen=0;
  398. if (Station.GetPreStationID()<=0) //情形1:当前车站的PreStationID=0,则当前站为始端站,Table_DCStationInfo中参数:PreStationID xyx注释
  399. {
  400. UpRailWayLen = GetTouchLenght(UpStartTouchNetID); //获取起始接触网上行的长度 //将起始上行接触网的长度作为当前站上行轨道长度 xyx注释
  401. DownRailWayLen = GetTouchLenght(DownStartTouchNetID); //获取起始接触网下行的长度 //将起始下行接触网的长度作为当前站下行轨道长度 xyx注释
  402. //将当前上行轨道节点设置为轨道头节点 xyx注释
  403. DCYSNODEMAP::iterator iter2 = m_DCFixNodesMap.find(UpHeadNodeID);//查找上行的头节点ID
  404. if (iter2!=m_DCFixNodesMap.end())
  405. {
  406. POWERNODE& PowerNode = iter2->second;
  407. PowerNode.HeadTailNode.SetDownNode(UpNodeID,UpRailWayLen,true); //如找到上行头节点ID,则设置上行头节点的下一节点(此处应有误SetDownNode是否应为SetUpNode) 则将UpNodeID设为头节点
  408. }
  409. else
  410. return false;
  411. //将当前上行轨道节点的前一节点设置为其本身 xyx注释
  412. pUpNode.SetPreNode(UpHeadNodeID,UpRailWayLen,true); //如Station没有前一车站,则设置上行轨道节点的前一节点信息
  413. //将当前下行轨道节点设置为轨道头节点 xyx注释
  414. DCYSNODEMAP::iterator iter4 = m_DCFixNodesMap.find(DownHeadNodeID);//查找下行头节点
  415. if (iter4!=m_DCFixNodesMap.end())
  416. {
  417. POWERNODE& PowerNode = iter4->second;
  418. PowerNode.HeadTailNode.SetDownNode(DownNodeID,DownRailWayLen,true); //设置下行头节点的下一节点
  419. }
  420. else
  421. return false;
  422. //将当前下行轨道节点的前一节点设置为其本身 xyx注释
  423. pDownNode.SetPreNode(DownHeadNodeID,DownRailWayLen,true); //如Station没有前一车站,则设置下行轨道节点的前一节点信息
  424. }
  425. else //情形2:若当前站为中间站 xyx注释
  426. {
  427. DCSTATIONMAP::iterator iter1=m_PowerStationNodeMap.find(Station.GetPreStationID());//查找Station车站对应的前一车站ID
  428. if (iter1!=m_PowerStationNodeMap.end())
  429. {
  430. //将前一站与当前站间的上、下行接触网长度赋给相应的上、下行轨道 xyx注释
  431. UpRailWayLen = GetTouchNetDurDistance(iter1->second.GetUpTouchNetID(),0,Station.GetUpTouchNetID(),0,TRAIN_DIR_UP); //获取Station车站与前一车站上行接触网之间的距离
  432. DownRailWayLen = GetTouchNetDurDistance(iter1->second.GetDownTouchNetID(),0,Station.GetDownTouchNetID(),0,TRAIN_DIR_DOWN);//获取Station车站与前一车站下行接触网之间的距离
  433. DCYSNODEMAP::iterator iter3 = m_DCFixNodesMap.find(iter1->second.GetUpRailwayNodeID());//查找Station前一车站的上行轨道节点
  434. if (iter3!=m_DCFixNodesMap.end())
  435. {
  436. POWERNODE& PowerNode = iter3->second; //前一车站上行轨道节点
  437. PowerNode.RailWayNode.SetNextNode(UpNodeID,UpRailWayLen,true); //将当前车站上行轨道节点设置为前一车站上行轨道节点的后一节点 xyx注释
  438. pUpNode.SetPreNode(PowerNode.NodeID,UpRailWayLen,true); //将前一车站上行轨道节点设置为当前车站上行轨道节点的前一节点 xyx注释
  439. }
  440. else
  441. return false;
  442. DCYSNODEMAP::iterator iter5 = m_DCFixNodesMap.find(iter1->second.GetDownRailwayNodeID());//查找Station前一车站的下行轨道节点
  443. if (iter5!=m_DCFixNodesMap.end())
  444. {
  445. POWERNODE& PowerNode = iter5->second; //前一车站下行轨道节点
  446. PowerNode.RailWayNode.SetNextNode(DownNodeID,DownRailWayLen,true); //将当前车站下行轨道节点设置为前一车站下行轨道节点的后一节点 xyx注释
  447. pDownNode.SetPreNode(PowerNode.NodeID,DownRailWayLen,true); //将前一车站下行轨道节点设置为当前车站下行轨道节点的前一节点 xyx注释
  448. }
  449. else
  450. {
  451. return false;
  452. }
  453. }
  454. else
  455. {
  456. return false;
  457. }
  458. }
  459. if (Station.GetNextStationID()<=0) //情形3:当前车站的NextStationID=0,则当前站为末端站,Table_DCStationInfo中参数:NextStationID xyx注释
  460. {
  461. double upnextnodelinelen = GetTouchLenght(UpEndTouchNetID); //获取上行最后一个接触网的长度 //将末端上行接触网的长度作为当前站上行轨道长度 xyx注释
  462. double downnextnodelinelen = GetTouchLenght(DownEndtouchNetID); //获取下行最后一个接触网的长度 //将末端下行接触网的长度作为当前站上行轨道长度 xyx注释
  463. DCYSNODEMAP::iterator iter2 = m_DCFixNodesMap.find(UpTailNodeID); //查找上行尾节点是否在固定节点列表信息中
  464. if (iter2!=m_DCFixNodesMap.end())
  465. {
  466. POWERNODE& PowerNode = iter2->second; //上行轨道尾节点
  467. PowerNode.HeadTailNode.SetDownNode(UpNodeID,upnextnodelinelen,true); //设置尾节点的下行节点 //将当前上行轨道节点设置为上行轨道尾节点 xyx注释
  468. pUpNode.SetNextNode(UpTailNodeID,upnextnodelinelen,true); //设置上行节点的下一节点 //将当前上行轨道节点的下一节点设为设置为其本身 xyx注释
  469. }
  470. else
  471. return false;
  472. DCYSNODEMAP::iterator iter6 = m_DCFixNodesMap.find(DownTailNodeID); //查找下行尾节点是否在固定节点列表信息中
  473. if (iter6!=m_DCFixNodesMap.end())
  474. {
  475. POWERNODE& PowerNode = iter6->second; //下行轨道尾节点
  476. PowerNode.HeadTailNode.SetDownNode(DownNodeID,downnextnodelinelen,true); //查找下行尾节点的下行节点 //将当前下行轨道节点设置为下行轨道尾节点 xyx注释
  477. pDownNode.SetNextNode(DownTailNodeID,downnextnodelinelen,true); //设置下行节点的下一节点 //将当前下行轨道节点的下一节点设为设置为其本身 xyx注释
  478. }
  479. else
  480. return false;
  481. }
  482. //将当前上行轨道节点添加至PowerNode1的轨道节点中,及直流固定节点m_DCFixNodesMap中 xyx注释
  483. POWERNODE PowerNode1;
  484. PowerNode1.setRailway(&pUpNode);
  485. m_DCFixNodesMap.insert(make_pair(UpNodeID,PowerNode1)); //将上行节点添加到固定节点列表中
  486. //将当前下行轨道节点添加至PowerNode1的轨道节点中,及直流固定节点m_DCFixNodesMap中 xyx注释
  487. POWERNODE PowerNode2;
  488. PowerNode2.setRailway(&pDownNode);
  489. m_DCFixNodesMap.insert(make_pair(DownNodeID,PowerNode2)); //将下行节点添加到固定节点列表中
  490. return true;
  491. }
  492. bool DCSysMG::CreateTrainNode() //生成列车节点并对其进行初始化
  493. {
  494. m_CritilSec.lock();
  495. vector<LineNodeData> m_UpRunDataList=m_UpRunFixDataList;
  496. vector<LineNodeData> m_DownRunDataList=m_DownFixRunDataList;
  497. NodeIndex=m_DCFixNodesMap.size();
  498. map<int,DCSysTrain>::iterator iter =TrainSInStationMap.begin();//DCSysTrain直流列车类, //TrainSInStationMap 根据行调系统发送过来的列车运行信息,并根据其受电状态构建列车信息表 (2016.03.18)
  499. for (;iter!=TrainSInStationMap.end();iter++) //TrainSInStationMap为在线上正常运行列车(受电弓有电)列表
  500. {
  501. //MOD BY YangS (add m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  502. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)//#define DISPATCH_RUN_STATUS_RUNNING 500
  503. {
  504. break;
  505. }
  506. AddTrainToNodes(iter->second,m_UpRunDataList,m_DownRunDataList);
  507. }
  508. m_CritilSec.unlock();
  509. return true;
  510. }
  511. string DCSysMG::GetTouchNetByPosition(int trackid,double ex) //根据轨道ID号和偏移(长度)获取接触网的位置 //获取列车所在的接触网ID xyx注释
  512. {
  513. TOUCHNETRELAMAP::iterator iter = m_NetTracksRelationMap.begin();
  514. for (;iter!=m_NetTracksRelationMap.end();iter++)
  515. {
  516. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  517. {
  518. return "";
  519. }
  520. TRACKSECMAP::iterator iter1 = iter->second.TrackSecsMap.find(trackid); //查找trackid区段是否在接触网轨道区段列表中,如存在,则返回对应的接触网ID
  521. if (iter1!=iter->second.TrackSecsMap.end())
  522. {
  523. Track_Section& sec= iter1->second;
  524. if (sec.TrackID==trackid&&ex<=sec.EndPos&&ex>=sec.StartPos)
  525. {
  526. return iter->second.TouchNetID;
  527. }
  528. }
  529. }
  530. return "";
  531. }
  532. bool DCSysMG::GetTouchNetPosByRailPosition(int trackid,double railex,string& touchnetid,double&touchnetex)// 通过轨道位置获取接触网的位置(主要是根据轨道编号和偏移量、接触网编号和偏移量进行综合计算)
  533. {
  534. touchnetex=0;
  535. TOUCHNETRELAMAP::iterator iter = m_NetTracksRelationMap.begin();
  536. for (;iter!=m_NetTracksRelationMap.end();iter++)
  537. {
  538. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  539. {
  540. return false;
  541. }
  542. TRACKSECMAP::iterator iter1 = iter->second.TrackSecsMap.find(trackid);
  543. if (iter1!=iter->second.TrackSecsMap.end())
  544. {
  545. Track_Section& sec= iter1->second; //trackid的轨道区段
  546. if (sec.TrackID==trackid&&railex<=sec.EndPos&&railex>=sec.StartPos)
  547. {
  548. //当前接触网对应0~n段轨道区段 xyx注释
  549. touchnetid= iter->second.TouchNetID;
  550. touchnetex = sec.EndPos-railex; //车在当前轨道区段(第i段)上的偏移exi xyx注释
  551. int index=sec.Index; //当前轨道区段i xyx注释
  552. TRACKSECMAP::iterator iter2 = iter->second.TrackSecsMap.begin();
  553. for (;iter2!=iter->second.TrackSecsMap.end();iter2++)
  554. {
  555. if (iter2->second.Index<index) //若车所在当前轨道区段i不是第一段(即index!=0) xyx注释
  556. {
  557. touchnetex+=(iter2->second.EndPos-iter2->second.StartPos); //车在接触网上的总偏移ex = 前i-1段轨道区段长度ex[0~(i-1)]之和 + 车在当前轨道区段i上的偏移exi xyx注释
  558. }
  559. }
  560. return true;
  561. }
  562. }
  563. }
  564. return false;
  565. }
  566. //查找节点LIST的索引(根据接触网编号和偏移量,列车运行方向,上下行线路节点数据进行查找)
  567. size_t DCSysMG::FindNodeListIndex(string touchnetid,double ex,int arrow,vector<LineNodeData>& m_UpRunDataList,vector<LineNodeData>& m_DownRunDataList)
  568. {
  569. TOUCHNETMAP::iterator itertrian = TouchNetMap.find(touchnetid);
  570. if (itertrian!=TouchNetMap.end()&&itertrian->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet)
  571. {
  572. CElectricEqpmt_Line_TouchNet*TouchNettrian=itertrian->second;
  573. if (arrow == TRAIN_DIR_UP) //列车运行方向为上行
  574. {
  575. for (size_t i=0;i<m_UpRunDataList.size();i++)
  576. {
  577. TOUCHNETMAP::iterator iterlist = TouchNetMap.find(m_UpRunDataList[i].TouchNetID);
  578. if (iterlist!=TouchNetMap.end()&&iterlist->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet)
  579. {
  580. CElectricEqpmt_Line_TouchNet*TouchNetlist=iterlist->second;
  581. if (TouchNettrian->GetIndex()<=TouchNetlist->GetIndex())
  582. {
  583. if (TouchNettrian->GetIndex()<TouchNetlist->GetIndex()) //touchnetid节点对应的索引小于上行数据列表对应的索引
  584. {
  585. return i; //则上行数据列表对应的索引号
  586. }
  587. if (TouchNettrian->GetIndex()==TouchNetlist->GetIndex())
  588. {
  589. if (ex<=m_UpRunDataList[i].excursion)
  590. {
  591. return i;
  592. }
  593. }
  594. }
  595. }
  596. }
  597. }
  598. else if (arrow == TRAIN_DIR_DOWN) //列车运行方向为下行
  599. {
  600. for (size_t i=0;i<m_DownRunDataList.size();i++)
  601. {
  602. TOUCHNETMAP::iterator iterlist = TouchNetMap.find(m_DownRunDataList[i].TouchNetID);
  603. if (iterlist!=TouchNetMap.end()&&iterlist->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet)
  604. {
  605. CElectricEqpmt_Line_TouchNet*TouchNetlist=iterlist->second;
  606. if (TouchNettrian->GetIndex()<=TouchNetlist->GetIndex())
  607. {
  608. if (TouchNettrian->GetIndex()<TouchNetlist->GetIndex())
  609. {
  610. return i;
  611. }
  612. if (TouchNettrian->GetIndex()==TouchNetlist->GetIndex())
  613. {
  614. if (ex<=m_DownRunDataList[i].excursion)
  615. {
  616. return i;
  617. }
  618. }
  619. }
  620. }
  621. }
  622. }
  623. }
  624. return -1;
  625. }
  626. bool DCSysMG::AddTrainToNodes(DCSysTrain& train,vector<LineNodeData>& m_UpRunDataList,vector<LineNodeData>& m_DownRunDataList)
  627. { //将列车信息添加到上行数据列表或下行数据列表中
  628. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  629. {
  630. return false;
  631. }
  632. //下面为对列车相关的数据进行初始化,并指明它的运行状态和方向
  633. vector<LineNodeData>* PRunDataList;
  634. if (train.arrow == TRAIN_DIR_UP)
  635. {
  636. PRunDataList=&m_UpRunDataList;
  637. }
  638. else if (train.arrow==TRAIN_DIR_DOWN)
  639. {
  640. PRunDataList=&m_DownRunDataList;
  641. }
  642. else
  643. {
  644. return false;
  645. }
  646. string triantouchid;
  647. double trianex;
  648. if (!JudgeShortCutAreaTrian(train)) //判断train是否在断路区域
  649. {
  650. return false;
  651. }
  652. if (!GetTouchNetPosByRailPosition(train.LineSectionID,train.excursion,triantouchid,trianex))//通过轨道位置获取train的接触网位置
  653. {
  654. return false;
  655. }
  656. size_t pos=FindNodeListIndex(triantouchid,trianex,train.arrow,m_UpRunDataList,m_DownRunDataList);
  657. if (pos>0&&pos<PRunDataList->size()-1)
  658. {
  659. TRIANONLINE pUpTrain; //列车与接触网的节点 //列车受电弓节点 xyx注释
  660. int UpNodeID = CreateNodeID();
  661. if (UpNodeID<0)
  662. return false;
  663. pUpTrain.Init(NodeIndex,UpNodeID,Dc_NodeKind_UpTrain);
  664. pUpTrain.PowerRate = train.PowerRate;
  665. NodeIndex++;
  666. pUpTrain.SetTrianInfo(train.ID,train.LineSectionID,train.excursion,train.arrow);
  667. // pUpTrain->SetDcNodeMap(&m_DcYFixNodesMap,&m_CritilSecYNodesMap);
  668. TRIANONRAILWAY pTrianRailway; //列车与轨道间的节点 //列车轮对节点 xyx注释
  669. int UpRailNodeID = CreateNodeID();
  670. if (UpRailNodeID<0)
  671. return false;
  672. pTrianRailway.Init(NodeIndex,UpRailNodeID,Dc_NodeKind_DownTrain);
  673. pTrianRailway.PowerRate = train.PowerRate;
  674. NodeIndex++;
  675. pUpTrain.SetRailwayNode(UpRailNodeID); //设置列车上行方向与轨道的节点 //将列车轮对节点设置为受电弓节点的关联节点 xyx注释
  676. pTrianRailway.SetOnlineNode(UpNodeID); //设置列车上行方向与接触网的节点的节点 //将受电弓节点设置为列车轮对节点的关联节点 xyx注释
  677. //GetTouchNetDurDistance获取一个周期内接触网的距离
  678. //以下功能为:将当前列车节点(含列车受电弓节点、轮对节点)插入已知的两节点中 xyx注释
  679. //情形1:处理当前列车节点与前一节点的关系 xyx注释
  680. double distance = GetTouchNetDurDistance((*PRunDataList)[pos-1].TouchNetID,(*PRunDataList)[pos-1].excursion,triantouchid,trianex,train.arrow);
  681. //电力节点的生成并根据列车运行方向对其初始化
  682. DCYSNODEMAP::iterator iter = m_DCNodesMap.find((*PRunDataList)[pos-1].ID);
  683. if (iter!=m_DCNodesMap.end()&&distance>=0)
  684. {
  685. //情形1-1:若已知前一节点为直流正极母线节点 xyx注释
  686. if (iter->second.nodeType==tgPowerNode::NodeType::eDc_NodeKind_RectierToTouchNet)//节点类型:整流器到接触网
  687. {
  688. POWERNODE& PowerNode = iter->second;
  689. if (train.arrow == TRAIN_DIR_UP)
  690. {
  691. PowerNode.RectierToTouchNetNode.SetUpNextNode(UpNodeID,distance,true); //上行:将受电弓节点设为直流正极母线节点的下一个节点 xyx注释
  692. }
  693. else if (train.arrow==TRAIN_DIR_DOWN)
  694. {
  695. PowerNode.RectierToTouchNetNode.SetDownNextNode(UpNodeID,distance,true); //下行:将受电弓节点设为直流正极母线节点的下一个节点 xyx注释
  696. }
  697. DCYSNODEMAP::iterator iter2 = m_DCNodesMap.find(PowerNode.RectierToTouchNetNode.GetInnerNodeID()); //查找内节点
  698. if (iter2!=m_DCNodesMap.end())
  699. {
  700. POWERNODE& PowerNode1 = iter2->second;
  701. int railwayid;
  702. if (train.arrow == TRAIN_DIR_UP)
  703. {
  704. railwayid = PowerNode1.RectierToRailwayNode.GetUpNode();
  705. }
  706. else if (train.arrow==TRAIN_DIR_DOWN)
  707. {
  708. railwayid = PowerNode1.RectierToRailwayNode.GetDownNode();
  709. }
  710. DCYSNODEMAP::iterator iter3 = m_DCNodesMap.find(railwayid);
  711. if (iter3!=m_DCNodesMap.end())
  712. {
  713. POWERNODE& PowerNode2 = iter3->second;
  714. PowerNode2.RailWayNode.SetNextNode(UpRailNodeID,distance,true); //将列车轮对节点设为直流负极母线节点的下一个节点 xyx注释
  715. pTrianRailway.SetPreNode(PowerNode2.NodeID,distance,PowerNode2.RectierToRailwayNode.GetPower()); //将直流负极母线节点设为列车轮对节点的下一个节点 xyx注释
  716. // TRACE("RailWayNode id = %d \n",PowerNode2.NodeID);//为测试用例函数,类似于printf()
  717. // TRACE("PreNodeID = %d \n",PowerNode2.RailWayNode.PreNodeID);
  718. // TRACE("NextNodeID = %d \n",PowerNode2.RailWayNode.NextNodeID);
  719. // TRACE("RectierNodeID = %d \n",PowerNode2.RailWayNode.RectierNodeID);
  720. // TRACE("\n");
  721. }
  722. }
  723. pUpTrain.SetPreNode(iter->second.NodeID,distance,PowerNode.RectierToTouchNetNode.GetPower()); //将直流正极母线节点设为列车受电弓节点的前一个节点 xyx注释
  724. // TRACE("RectierToTouchNet id = %d \n",PowerNode.NodeID);
  725. // TRACE("UpPreNodeID = %d \n",PowerNode.RectierToTouchNetNode.UpPreNodeID);
  726. // TRACE("DownPreNodeID = %d \n",PowerNode.RectierToTouchNetNode.DownPreNodeID);
  727. // TRACE("UpNextNodeID = %d \n",PowerNode.RectierToTouchNetNode.UpNextNodeID);
  728. // TRACE("DownNextNodeID = %d \n",PowerNode.RectierToTouchNetNode.DownNextNodeID);
  729. // TRACE("\n");
  730. }
  731. //情形1-2:若已知前一节点为受电弓节点 xyx注释
  732. else if (iter->second.nodeType==tgPowerNode::NodeType::eDc_NodeKind_UpTrain) //节点类型:上行列车
  733. {
  734. POWERNODE& PowerNode = iter->second;
  735. PowerNode.TrianOnLineNode.SetNextNode(UpNodeID,distance,true); //将当前受电弓节点设为已知前一受电弓节点的下一节点 xyx注释
  736. DCYSNODEMAP::iterator iter4 = m_DCNodesMap.find(PowerNode.TrianOnLineNode.GetRailwayNodeID());
  737. if (iter4!=m_DCNodesMap.end())
  738. {
  739. POWERNODE& PowerNode1 = iter4->second;
  740. PowerNode1.TrianOnRailway.SetNextNode(UpRailNodeID,distance,true); //将当前轮对节点设为已知前一轮对节点的下一节点 xyx注释
  741. pTrianRailway.SetPreNode(PowerNode1.NodeID,distance,true); //TRIANONRAILWAY pTrianRailway;//?列车在轨道 //将已知前一轮对节点设为当前轮对节点的前一节点 xyx注释
  742. // TRACE("TrianOnRailway id = %d \n",PowerNode1.NodeID);
  743. // TRACE("PreNodeID = %d \n",PowerNode1.TrianOnRailway.PreNodeID);
  744. // TRACE("NextNodeID = %d \n",PowerNode1.TrianOnRailway.NextNodeID);
  745. // TRACE("\n");
  746. }
  747. pUpTrain.SetPreNode(iter->second.NodeID,distance,true); //将已知前一受电弓节点为当前受电弓节点的前一节点 xyx注释
  748. }
  749. //情形1-3:若已知前一节点为轨道头节点 xyx注释
  750. else if (iter->second.nodeType==tgPowerNode::NodeType::eDc_NodeKind_HeadTail)
  751. {
  752. POWERNODE& PowerNode = iter->second;
  753. if (PowerNode.HeadTailNode.m_NodeCategory==Dc_NodeKind_UPHead||PowerNode.HeadTailNode.m_NodeCategory==Dc_NodeKind_DownHead)
  754. {
  755. PowerNode.HeadTailNode.SetDownNode(UpRailNodeID,trianex,true); //将当前轮对节点设为已知轨道头节点的下一节点 xyx注释
  756. pTrianRailway.SetPreNode(PowerNode.NodeID,trianex,true); //将已知轨道头节点设为当前轮对节点的上一节点 xyx注释
  757. }
  758. else
  759. return false;
  760. }
  761. else
  762. return false;
  763. }
  764. else
  765. return false;
  766. //情形2:处理当前列车节点与后一节点间的关系 xyx注释
  767. distance = GetTouchNetDurDistance(triantouchid,trianex,(*PRunDataList)[pos].TouchNetID,(*PRunDataList)[pos].excursion,train.arrow);
  768. DCYSNODEMAP::iterator iter1 = m_DCNodesMap.find((*PRunDataList)[pos].ID);
  769. if (iter1!=m_DCNodesMap.end()&&distance>=0)
  770. {
  771. //情形2-1:若已知后一节点为直流正极母线节点 xyx注释
  772. if (iter1->second.nodeType==tgPowerNode::NodeType::eDc_NodeKind_RectierToTouchNet)
  773. {
  774. POWERNODE& pRecterToTouchNet = iter1->second;
  775. if (train.arrow == TRAIN_DIR_UP)
  776. {
  777. pRecterToTouchNet.RectierToTouchNetNode.SetUpPreNode(UpNodeID,distance,true); //上行:将当前受电弓节点设为已知后一直流正极母线节点的前一节点 xyx注释
  778. }
  779. else if (train.arrow==TRAIN_DIR_DOWN)
  780. {
  781. pRecterToTouchNet.RectierToTouchNetNode.SetDownPreNode(UpNodeID,distance,true); //下行
  782. }
  783. DCYSNODEMAP::iterator iter5 = m_DCNodesMap.find(pRecterToTouchNet.RectierToTouchNetNode.GetInnerNodeID()); //查找与当前直流正极母线节点关联的直流负极母线节点 xyx注释
  784. if (iter5!=m_DCNodesMap.end())
  785. {
  786. POWERNODE& PowerNode =iter5->second;
  787. int railwayid;
  788. if (train.arrow == TRAIN_DIR_UP)
  789. {
  790. railwayid = PowerNode.RectierToRailwayNode.GetUpNode(); //获取直流负极母线节点上的上行回流负极节点 xyx注释
  791. }
  792. else if (train.arrow==TRAIN_DIR_DOWN)
  793. {
  794. railwayid = PowerNode.RectierToRailwayNode.GetDownNode(); //获取直流负极母线节点上的下行回流负极节点 xyx注释
  795. }
  796. DCYSNODEMAP::iterator iter6 = m_DCNodesMap.find(railwayid);
  797. if (iter6!=m_DCNodesMap.end())
  798. {
  799. POWERNODE& PowerNode1 = iter6->second;
  800. PowerNode1.RailWayNode.SetPreNode(UpRailNodeID,distance,true); //将列车轮对节点设为已知后端直流负极母线节点的前一个节点 xyx注释
  801. pTrianRailway.SetNextNode(PowerNode1.NodeID,distance,PowerNode.RectierToRailwayNode.GetPower()); //将已知后端直流负极母线节点设为列车轮对节点的后一个节点 xyx注释
  802. // TRACE("RailWayNode id = %d \n",PowerNode1.NodeID);
  803. // TRACE("PreNodeID = %d \n",PowerNode1.RailWayNode.PreNodeID);
  804. // TRACE("NextNodeID = %d \n",PowerNode1.RailWayNode.NextNodeID);
  805. // TRACE("RectierNodeID = %d \n",PowerNode1.RailWayNode.RectierNodeID);
  806. // TRACE("\n");
  807. }
  808. }
  809. pUpTrain.SetNextNode(iter1->second.NodeID,distance,pRecterToTouchNet.RectierToTouchNetNode.GetPower()); //将已知后端直流正极母线节点设为当前受电弓节点的后一节点 xyx注释
  810. // TRACE("RectierToTouchNet id = %d \n",pRecterToTouchNet.NodeID);
  811. // TRACE("UpPreNodeID = %d \n",pRecterToTouchNet.RectierToTouchNetNode.UpPreNodeID);
  812. // TRACE("DownPreNodeID = %d \n",pRecterToTouchNet.RectierToTouchNetNode.DownPreNodeID);
  813. // TRACE("UpNextNodeID = %d \n",pRecterToTouchNet.RectierToTouchNetNode.UpNextNodeID);
  814. // TRACE("DownNextNodeID = %d \n",pRecterToTouchNet.RectierToTouchNetNode.DownNextNodeID);
  815. // TRACE("\n");
  816. }
  817. //情形2-2:若已知后一节点为受电弓节点 xyx注释
  818. else if (iter1->second.nodeType==tgPowerNode::NodeType::eDc_NodeKind_UpTrain)
  819. {
  820. POWERNODE& PowerNode = iter1->second;
  821. PowerNode.TrianOnLineNode.SetPreNode(UpNodeID,distance,true); //将当前受电弓节点设为已知后端受电弓节点的前一节点 xyx注释
  822. DCYSNODEMAP::iterator iter7 = m_DCNodesMap.find(PowerNode.TrianOnLineNode.GetRailwayNodeID());
  823. if (iter7!=m_DCNodesMap.end())
  824. {
  825. POWERNODE& PowerNode1 = iter7->second;
  826. PowerNode1.TrianOnRailway.SetPreNode(UpRailNodeID,distance,true); //将当前轮对节点设为已知后端轮对节点的前一节点 xyx注释
  827. pTrianRailway.SetNextNode(PowerNode1.NodeID,distance,true); //将已知后端轮对节点设为当前轮对节点的后一节点 xyx注释
  828. // TRACE("TrianOnRailway id = %d \n",PowerNode1.NodeID);
  829. // TRACE("PreNodeID = %d \n",PowerNode1.TrianOnRailway.PreNodeID);
  830. // TRACE("NextNodeID = %d \n",PowerNode1.TrianOnRailway.NextNodeID);
  831. // TRACE("\n");
  832. }
  833. pUpTrain.SetNextNode(iter1->second.NodeID,distance,true); //将已知后端受电弓节点设为当前受电弓节点的后一节点 xyx注释
  834. }
  835. //情形2-3:若已知后一节点为轨道尾节点 xyx注释
  836. else if (iter->second.nodeType==tgPowerNode::NodeType::eDc_NodeKind_HeadTail)
  837. {
  838. POWERNODE& PowerNode = iter->second;
  839. if (PowerNode.HeadTailNode.m_NodeCategory==Dc_NodeKind_UPTail||PowerNode.HeadTailNode.m_NodeCategory==Dc_NodeKind_DownTail)
  840. {
  841. PowerNode.HeadTailNode.SetDownNode(UpRailNodeID,trianex,true); //将当前轮对节点设为已知轨道尾节点的前一节点 xyx注释
  842. pTrianRailway.SetNextNode(PowerNode.NodeID,trianex,true); //将已知轨道尾节点设为当前轮对节点的后一节点 xyx注释
  843. }
  844. else
  845. return false;
  846. }
  847. else
  848. return false;
  849. }
  850. else
  851. return false;
  852. //将当前受电弓节点添加至接触线路的信息中 xyx注释
  853. LineNodeData trainnode;
  854. trainnode.ID = UpNodeID;
  855. trainnode.excursion = trianex;
  856. trainnode.Kind = Dc_NodeKind_UpTrain;
  857. trainnode.TouchNetID = triantouchid;
  858. //将当前受电弓节点添加至上、下行接触线沿线的节点列表m_UpRunDataList、m_DownRunDataList中 xyx注释
  859. if (train.arrow == TRAIN_DIR_UP)
  860. {
  861. m_UpRunDataList.insert(m_UpRunDataList.begin()+pos,trainnode);
  862. }
  863. else if (train.arrow==TRAIN_DIR_DOWN)
  864. {
  865. m_DownRunDataList.insert(m_DownRunDataList.begin()+pos,trainnode);
  866. }
  867. //将当前受电弓节点添加至直流节点m_DCNodesMap中 xyx注释
  868. POWERNODE PowerNode1;
  869. PowerNode1.setTrianOnLine(&pUpTrain);
  870. m_DCNodesMap.insert(make_pair(UpNodeID,PowerNode1));
  871. POWERNODE PowerNode2;
  872. PowerNode2.setTrianOnRailway(&pTrianRailway);
  873. m_DCNodesMap.insert(make_pair(UpRailNodeID,PowerNode2));
  874. return true;
  875. }
  876. return false;
  877. }
  878. double DCSysMG::GetTouchLenght(string id) //获取接触网的长度
  879. {
  880. double len=0;
  881. TOUCHNETRELAMAP::iterator iter = m_NetTracksRelationMap.find(id);//根据id号在接触网与轨道的关系表中查询信息
  882. if (iter!=m_NetTracksRelationMap.end())
  883. {
  884. TRACKSECMAP::iterator iter2 = iter->second.TrackSecsMap.begin();
  885. for (;iter2!=iter->second.TrackSecsMap.end();iter2++)
  886. {
  887. len+=(iter2->second.EndPos-iter2->second.StartPos);//长度计算 //接触网对应多段轨道区段,则接触网长度=多段轨道区段长度总和 xyx注释
  888. }
  889. }
  890. return len;
  891. }
  892. bool DCSysMG::CreateFixYNodes() //创建固定节点
  893. {
  894. m_DCFixNodesMap.clear();
  895. m_DCNodesMap.clear();
  896. NodeIDsCount=1000;
  897. NodeIndex=0;
  898. if (!CreateHeadNodes()) //创建头节点
  899. {
  900. return false;
  901. }
  902. if (!CreateTailNodes()) //创建尾节点
  903. {
  904. return false;
  905. }
  906. DCSTATIONMAP::iterator iter = m_PowerStationNodeMap.begin();
  907. while (iter!=m_PowerStationNodeMap.end())
  908. {
  909. if (iter->second.GetID()>0)
  910. {
  911. if (!CreateRectierToTouchNetNode(iter->second)) //创建整流器到接触网节点
  912. {
  913. return false;
  914. }
  915. if (!CreateRectierToRailWayNode(iter->second)) //创建整流器到轨道节点
  916. {
  917. return false;
  918. }
  919. if (!CreateRailWayNode(iter->second)) //创建轨道节点
  920. {
  921. return false;
  922. }
  923. }
  924. iter = m_PowerStationNodeMap.find(iter->second.GetNextStationID());//GetNextStationID()获取下一个车站节点的ID号
  925. //iter++;
  926. //if (iter ==nullptr)
  927. //{
  928. // return false;
  929. //}
  930. }
  931. PushTailNodes(); //将尾节点添加到固定节点列表中
  932. return true;
  933. }
  934. int DCSysMG::GetRelaNodeRectIndex(int RelationNodeID) //获取关系节点的矩阵索引 //获取关系节点的编号 xyx注释
  935. {
  936. DCYSNODEMAP::iterator iter = m_DCNodesMap.find(RelationNodeID);
  937. if (iter!=m_DCNodesMap.end())
  938. {
  939. if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_HeadTail)//?HeadTail?
  940. {
  941. return iter->second.HeadTailNode.GetRectIndex();
  942. }
  943. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RailWay)
  944. {
  945. return iter->second.RailWayNode.GetRectIndex();
  946. }
  947. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToRailWay)//?
  948. {
  949. return iter->second.RectierToRailwayNode.GetRectIndex();
  950. }
  951. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)//、?
  952. {
  953. return iter->second.RectierToTouchNetNode.GetRectIndex();
  954. }
  955. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_UpTrain)
  956. {
  957. return iter->second.TrianOnLineNode.GetRectIndex();
  958. }
  959. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_DownTrain)
  960. {
  961. return iter->second.TrianOnRailway.GetRectIndex();
  962. }
  963. }
  964. return -1;
  965. }
  966. void DCSysMG::GetRectiterVPublish(std::vector<POWERVALUE>& PQIList) //获取整流器电压发布数据信息
  967. {
  968. DCYSNODEMAP::iterator iter = m_DCNodesMap.begin();
  969. for (;iter!=m_DCNodesMap.end();iter++)
  970. {
  971. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  972. {
  973. return;
  974. }
  975. if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet) //整流器到接触网
  976. {
  977. POWERVALUE TrianNodeV;
  978. RECTIERTOTOUCHNET& RectierNode = iter->second.RectierToTouchNetNode;
  979. TrianNodeV.V=m_EquationCalcul.b[RectierNode.m_RectIndex][m_EquationCalcul.lie-1]; //直流母线节点电压
  980. TrianNodeV.ID=RectierNode.m_NodeID;
  981. TrianNodeV.StationID=RectierNode.StationID;
  982. PQIList.push_back(TrianNodeV); //保存电压
  983. }
  984. }
  985. }
  986. void DCSysMG::GetTrianVPublish(std::vector<POWERVALUE>& PQIList) //获取列车电压发布值
  987. {
  988. DCYSNODEMAP::iterator iter = m_DCNodesMap.begin();
  989. for (;iter!=m_DCNodesMap.end();iter++)
  990. {
  991. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  992. {
  993. return;
  994. }
  995. if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_UpTrain)
  996. {
  997. POWERVALUE TrianNodeV;
  998. TRIANONLINE& TrianOnLineNode = iter->second.TrianOnLineNode;
  999. TrianNodeV.V=m_EquationCalcul.b[TrianOnLineNode.m_RectIndex][m_EquationCalcul.lie-1]; //列车受电弓节点电压
  1000. TrianNodeV.ID=TrianOnLineNode.TrianNO;
  1001. TrianNodeV.StationID=TrianOnLineNode.LineSectionNo;
  1002. PQIList.push_back(TrianNodeV); //保存电压
  1003. }
  1004. }
  1005. map<int,DCSysTrain>::iterator iter1 = m_ShortCutAreaTrians.begin();//短路区域列车的查找
  1006. for (;iter1!=m_ShortCutAreaTrians.end();iter1++)
  1007. {
  1008. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  1009. {
  1010. return;
  1011. }
  1012. POWERVALUE TrianNodeV;
  1013. TrianNodeV.V=0; //在短路区域的列车电压为0
  1014. TrianNodeV.ID=iter1->first;
  1015. PQIList.push_back(TrianNodeV);
  1016. }
  1017. }
  1018. void DCSysMG::GetBackVIPublish(std::vector<POWERVALUE>& PQIList) //获取回流线电压、电流的发布数据
  1019. {
  1020. DCYSNODEMAP::iterator iter = m_DCNodesMap.begin();
  1021. for (;iter!=m_DCNodesMap.end();iter++)
  1022. {
  1023. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  1024. {
  1025. return;
  1026. }
  1027. if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1028. {
  1029. POWERVALUE BackVI;
  1030. RECTIERTOTOUCHNET& BackNode = iter->second.RectierToTouchNetNode;
  1031. BackVI.V=m_EquationCalcul.b[BackNode.m_RectIndex][m_EquationCalcul.lie-1]; //直流正极母线节点电压
  1032. BackVI.StationID=BackNode.StationID;
  1033. float tmpv;
  1034. float tmplen=BackNode.Len_UpPreNode;
  1035. DCYSNODEMAP::iterator iterUpPre = m_DCNodesMap.find(BackNode.UpPreNodeID); //上行前一节点的相关计算
  1036. if (iterUpPre!=m_DCNodesMap.end())
  1037. {
  1038. tmpv = m_EquationCalcul.b[iterUpPre->second.GetRectIndex()][m_EquationCalcul.lie-1];//暂存电压的计算方法
  1039. tmplen = BackNode.Len_UpPreNode;
  1040. BackVI.InputI = (BackVI.V-tmpv)/(tmplen*R_Rate_ContactLine);//回流线电流的计算 //上行:前一直流母线节点与当前母线节点间的接触网线路电流 xyx注释
  1041. }
  1042. DCYSNODEMAP::iterator iterUpNext = m_DCNodesMap.find(BackNode.UpNextNodeID);//上行下一节点的相关计算
  1043. if (iterUpNext!=m_DCNodesMap.end())
  1044. {
  1045. tmpv = m_EquationCalcul.b[iterUpNext->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1046. tmplen = BackNode.Len_UpNextNode;
  1047. BackVI.OutputI = (BackVI.V-tmpv)/(tmplen*R_Rate_ContactLine); //上行:后一直流母线节点与当前母线节点间的接触网线路电流 xyx注释
  1048. }
  1049. DCYSNODEMAP::iterator iterDownNext = m_DCNodesMap.find(BackNode.DownNextNodeID);//下行下一节点的相关计算
  1050. if (iterDownNext!=m_DCNodesMap.end())
  1051. {
  1052. tmpv = m_EquationCalcul.b[iterDownNext->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1053. tmplen = BackNode.Len_DownNextNode;
  1054. BackVI.P = (BackVI.V-tmpv)/(tmplen*R_Rate_ContactLine); //下行下一节点电流 //下行:后一直流母线节点与当前母线节点间的接触网线路电流(此处将电流值赋予节点有功变量??) xyx注释
  1055. }
  1056. DCYSNODEMAP::iterator iterDownPre = m_DCNodesMap.find(BackNode.DownPreNodeID);//下行前一节点的相关计算
  1057. if (iterDownPre!=m_DCNodesMap.end())
  1058. {
  1059. tmpv = m_EquationCalcul.b[iterDownPre->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1060. tmplen = BackNode.Len_DownPreNode;
  1061. BackVI.Q = (BackVI.V-tmpv)/(tmplen*R_Rate_ContactLine); //下行前一节点电流 //下行:前一直流母线节点与当前母线节点间的接触网线路电流(此处将电流值赋予节点无功变量??) xyx注释
  1062. }
  1063. PQIList.push_back(BackVI);
  1064. }
  1065. }
  1066. }
  1067. bool DCSysMG::JudgeShortCutAreaTrian(DCSysTrain& train) //判断train是否在短路区域
  1068. {
  1069. string curtouchnet=GetTouchNetByPosition(train.LineSectionID,train.excursion); //获取列车所在的接触网ID xyx注释
  1070. m_ShortCutAreaTrians.erase(train.ID);
  1071. ELEEQPMTMAP:: iterator itEqpmt = ElectricEqpmtMap.find(curtouchnet);
  1072. if (itEqpmt!=ElectricEqpmtMap.end())
  1073. {
  1074. //if (iter->second->GetType()==OCC_EQPMTTYPE_1500vThirdTrack&&iter->second->GetStatus()==Electric_Eqpmt_Status_OFF) //判断列车是否在无电区
  1075. if (itEqpmt->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet&&itEqpmt->second->GetStatus()==Electric_Eqpmt_Status_OFF) //判断列车是否在无电区
  1076. {
  1077. m_ShortCutAreaTrians.insert(make_pair(train.ID,train)); //m_ShortCutAreaTrians 无电区列车列表
  1078. return false;
  1079. }
  1080. }
  1081. //TOUCHNETMAP::iterator iter = TouchNetMap.find(curtouchnet);
  1082. //if (iter!=TouchNetMap.end())
  1083. //{
  1084. // //if (iter->second->GetType()==Electric_EqpmtType_TouchNetLine&&iter->second->GetStatus()==Electric_Eqpmt_Status_OFF) //判断列车是否在无电区
  1085. // if (iter->second->GetType()==Electric_EqpmtType_TouchNetLine&&iter->second->m_status==Electric_Eqpmt_Status_OFF) //判断列车是否在无电区
  1086. // {
  1087. // m_ShortCutAreaTrians.insert(make_pair(train.ID,train)); //m_ShortCutAreaTrians 无电区列车列表
  1088. // return false;
  1089. // }
  1090. //}
  1091. return true;
  1092. }
  1093. bool DCSysMG::CreateRectArray() //生成矩阵数组 //生成节点导纳矩阵[前m_DCNodesMap.size()行,m_DCNodesMap.size()列]+节点注入电流(每行的最后一列) xyx注释
  1094. {
  1095. m_EquationCalcul.Clear();
  1096. m_EquationCalcul.SetHangLie(m_DCNodesMap.size(),m_DCNodesMap.size()+1);
  1097. DCYSNODEMAP::iterator iter = m_DCNodesMap.begin();
  1098. for (size_t i=0;iter!=m_DCNodesMap.end() && i < m_nMaxSigleArrowTrainNums;i++,iter++) ////Max_SigleArrowTrain_Nums单方向最大列车运行数量
  1099. {
  1100. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  1101. {
  1102. return false;
  1103. }
  1104. //情形1:矩阵中头、尾节点参数设置,含:自导Yii,互导Yij,节点注入电流Ii=0 xyx注释
  1105. if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_HeadTail) //电力头尾节点类型的判断
  1106. {
  1107. HEADTAIL& HeadTail = iter->second.HeadTailNode;
  1108. DCYSNODEMAP::iterator iterfix = m_DCFixNodesMap.find(iter->second.NodeID);
  1109. HEADTAIL& headold = iterfix->second.HeadTailNode; //headold原节点
  1110. if (HeadTail.m_RectIndex>=0&&HeadTail.m_RectIndex<m_DCNodesMap.size()&&HeadTail.m_RectIndex < m_nMaxSigleArrowTrainNums)
  1111. {
  1112. m_EquationCalcul.SetParam(HeadTail.m_RectIndex,HeadTail.m_RectIndex,HeadTail.GetSelfYValue()); //对角元素(m_RectIndex,m_RectIndex) //节点矩阵主对角线元素:当前节点的自导Yii xyx注释
  1113. }
  1114. for (int i =0;i<HeadTail.RelationCount;i++ )
  1115. {
  1116. int relationid = HeadTail.RelaNodes[i].NodeID;
  1117. double HD = HeadTail.GetRelaNodeYValue(relationid); //当前节点与关联节点间的互导 xyx注释 //获取关系节点导纳值
  1118. int rectindex = GetRelaNodeRectIndex(relationid); //关联节点间的编号 xyx注释 //获取关系节点矩阵的索引
  1119. if (rectindex>=0&&rectindex<m_DCNodesMap.size()&&rectindex< m_nMaxSigleArrowTrainNums)
  1120. {
  1121. m_EquationCalcul.SetParam(HeadTail.m_RectIndex,rectindex,HD); //节点矩阵非对角线元素:当前节点与关联节点间的互导Yij xyx注释 //与对角元素同行的关系节点元素 (m_RectIndex,rectindex)
  1122. }
  1123. }
  1124. m_EquationCalcul.SetParam(HeadTail.m_RectIndex,m_DCNodesMap.size(),0.0); //最后一列:节点注入电流Ii=0 xyx注释 //m_RectIndex行的最后一个元素设置为0
  1125. }
  1126. //情形2:矩阵中直流正极母线节点参数设置,含:自导Yii,互导Yij,节点注入电流Ii(为+) xyx注释
  1127. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet) //整流器到接触网节点类型的判断
  1128. {
  1129. RECTIERTOTOUCHNET& RectierToTouchNetNode = iter->second.RectierToTouchNetNode;
  1130. if (RectierToTouchNetNode.m_RectIndex>=0&&RectierToTouchNetNode.m_RectIndex<m_DCNodesMap.size()&&RectierToTouchNetNode.m_RectIndex< m_nMaxSigleArrowTrainNums)
  1131. {
  1132. if (!RectierToTouchNetNode.GetPower()) //根据节点带电状态设置自导 xyx注释
  1133. {
  1134. m_EquationCalcul.SetParam(RectierToTouchNetNode.m_RectIndex,RectierToTouchNetNode.m_RectIndex,0.0);
  1135. }
  1136. else
  1137. {
  1138. m_EquationCalcul.SetParam(RectierToTouchNetNode.m_RectIndex,RectierToTouchNetNode.m_RectIndex,RectierToTouchNetNode.GetSelfYValue()); //主对角线元素:自导Yii xyx注释
  1139. }
  1140. }
  1141. for (int i =0;i<Max_NodeRelationNums;i++ )
  1142. {
  1143. int relationid = RectierToTouchNetNode.RelaNodes[i].NodeID;
  1144. double HD = RectierToTouchNetNode.GetRelaNodeYValue(relationid);
  1145. int rectindex = GetRelaNodeRectIndex(relationid);
  1146. if (rectindex>=0&&rectindex<m_DCNodesMap.size()&&rectindex< m_nMaxSigleArrowTrainNums)
  1147. {
  1148. if (!RectierToTouchNetNode.GetPower()) //根据节点带电状态设置互导 xyx注释
  1149. {
  1150. m_EquationCalcul.SetParam(RectierToTouchNetNode.m_RectIndex,rectindex,0.0);
  1151. }
  1152. else
  1153. {
  1154. m_EquationCalcul.SetParam(RectierToTouchNetNode.m_RectIndex,rectindex,HD); //非主对角线元素:互导Yij xyx注释
  1155. }
  1156. }
  1157. }
  1158. double I=0;
  1159. DCSTATIONMAP::iterator iter1 = m_PowerStationNodeMap.find(RectierToTouchNetNode.StationID);
  1160. if (iter1!=m_PowerStationNodeMap.end())
  1161. {
  1162. Dc_PowerStation& powerstation = iter1->second;
  1163. I=powerstation.GetInnerI(); //节点注入电流Ii=整流器当前运行区间等效电压/等效阻抗 xyx注释 //获取工区内的电流
  1164. }
  1165. if (!RectierToTouchNetNode.GetPower()) //根据节点带电状态设置注入电流 xyx注释
  1166. {
  1167. m_EquationCalcul.SetParam(RectierToTouchNetNode.m_RectIndex,m_DCNodesMap.size(),0.0);
  1168. }
  1169. else
  1170. {
  1171. m_EquationCalcul.SetParam(RectierToTouchNetNode.m_RectIndex,m_DCNodesMap.size(),I); //最后一列:节点注入电流Ii(+) xyx注释 //整流器到接触网是消耗电流,则用正
  1172. }
  1173. }
  1174. //情形3:矩阵中直流负极母线上的回流节点参数设置,含:自导Yii,互导Yij,节点注入电流Ii(为-) xyx注释
  1175. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToRailWay) //整流器到轨道节点类型的判断
  1176. {
  1177. RECTIERTORAILWAY& RectierToRailwayNode = iter->second.RectierToRailwayNode;
  1178. if (RectierToRailwayNode.m_RectIndex>=0&&RectierToRailwayNode.m_RectIndex<m_DCNodesMap.size()&&RectierToRailwayNode.m_RectIndex< m_nMaxSigleArrowTrainNums)
  1179. {
  1180. if (!RectierToRailwayNode.GetPower())
  1181. {
  1182. m_EquationCalcul.SetParam(RectierToRailwayNode.m_RectIndex,RectierToRailwayNode.m_RectIndex,0.0); //主对角线元素:自导Yii xyx注释
  1183. }
  1184. else
  1185. {
  1186. m_EquationCalcul.SetParam(RectierToRailwayNode.m_RectIndex,RectierToRailwayNode.m_RectIndex,RectierToRailwayNode.GetSelfYValue()); //主对角线元素:自导Yii xyx注释
  1187. }
  1188. }
  1189. for (int i =0;i<RectierToRailwayNode.RelationCount;i++ )
  1190. {
  1191. int relationid = RectierToRailwayNode.RelaNodes[i].NodeID;
  1192. double HD = RectierToRailwayNode.GetRelaNodeYValue(relationid);
  1193. int rectindex = GetRelaNodeRectIndex(relationid);
  1194. if (rectindex>=0&&rectindex<m_DCNodesMap.size()&&rectindex< m_nMaxSigleArrowTrainNums)
  1195. {
  1196. if (!RectierToRailwayNode.GetPower())
  1197. {
  1198. m_EquationCalcul.SetParam(RectierToRailwayNode.m_RectIndex,rectindex,0.0);
  1199. }
  1200. else
  1201. {
  1202. m_EquationCalcul.SetParam(RectierToRailwayNode.m_RectIndex,rectindex,HD); //非主对角线元素:互导Yij xyx注释
  1203. }
  1204. }
  1205. }
  1206. double I=0;
  1207. DCSTATIONMAP::iterator iter1 = m_PowerStationNodeMap.find(RectierToRailwayNode.StationID);
  1208. if (iter1!=m_PowerStationNodeMap.end())
  1209. {
  1210. Dc_PowerStation& powerstation = iter1->second;
  1211. I=powerstation.GetInnerI();
  1212. }
  1213. if (!RectierToRailwayNode.GetPower())
  1214. {
  1215. m_EquationCalcul.SetParam(RectierToRailwayNode.m_RectIndex,m_DCNodesMap.size(),0.0);
  1216. }
  1217. else
  1218. {
  1219. m_EquationCalcul.SetParam(RectierToRailwayNode.m_RectIndex,m_DCNodesMap.size(),-I); //最后一列:节点注入电流Ii(-) xyx注释 //整流器到轨道的电流是回流,则用负,该行的最后一个元素存储电流值
  1220. }
  1221. }
  1222. //情形4:矩阵中轨道节点参数设置,含:自导Yii,互导Yij,节点注入电流Ii=0 xyx注释
  1223. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RailWay) //轨道节点类型的判断
  1224. {
  1225. RAILWAY& RailWayNode = iter->second.RailWayNode;
  1226. if (RailWayNode.m_RectIndex>=0&&RailWayNode.m_RectIndex<m_DCNodesMap.size()&&RailWayNode.m_RectIndex< m_nMaxSigleArrowTrainNums)
  1227. {
  1228. m_EquationCalcul.SetParam(RailWayNode.m_RectIndex,RailWayNode.m_RectIndex,RailWayNode.GetSelfYValue()); //主对角线元素:自导Yii xyx注释
  1229. }
  1230. for (int i =0;i<RailWayNode.RelationCount;i++ )
  1231. {
  1232. int relationid = RailWayNode.RelaNodes[i].NodeID;
  1233. double HD = RailWayNode.GetRelaNodeYValue(relationid);
  1234. int rectindex = GetRelaNodeRectIndex(relationid);
  1235. if (rectindex>=0&&rectindex<m_DCNodesMap.size()&&rectindex< m_nMaxSigleArrowTrainNums)
  1236. {
  1237. m_EquationCalcul.SetParam(RailWayNode.m_RectIndex,rectindex,HD); //非主对角线元素:互导Yij xyx注释
  1238. }
  1239. }
  1240. m_EquationCalcul.SetParam(RailWayNode.m_RectIndex,m_DCNodesMap.size(),0);
  1241. }
  1242. //情形5:矩阵中列车受电弓节点参数设置,含:自导Yii,互导Yij,节点注入电流Ii(-) xyx注释
  1243. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_UpTrain) //列车上行节点类型的判断
  1244. {
  1245. TRIANONLINE& TrianOnLineNode = iter->second.TrianOnLineNode;
  1246. if (TrianOnLineNode.m_RectIndex>=0&&TrianOnLineNode.m_RectIndex<m_DCNodesMap.size()&&TrianOnLineNode.m_RectIndex< m_nMaxSigleArrowTrainNums)
  1247. {
  1248. m_EquationCalcul.SetParam(TrianOnLineNode.m_RectIndex,TrianOnLineNode.m_RectIndex,TrianOnLineNode.GetSelfYValue()); //主对角线元素:自导Yii xyx注释
  1249. }
  1250. for (int i =0;i<TrianOnLineNode.RelationCount;i++ )
  1251. {
  1252. int relationid = TrianOnLineNode.RelaNodes[i].NodeID;
  1253. double HD = TrianOnLineNode.GetRelaNodeYValue(relationid);
  1254. int rectindex = GetRelaNodeRectIndex(relationid);
  1255. if (rectindex>=0&&rectindex<m_DCNodesMap.size()&&rectindex< m_nMaxSigleArrowTrainNums)
  1256. {
  1257. m_EquationCalcul.SetParam(TrianOnLineNode.m_RectIndex,rectindex,HD); //非主对角线元素:互导Yij xyx注释
  1258. }
  1259. }
  1260. double I=0;
  1261. double V=0;
  1262. DCYSNODEMAP::iterator iter2 = m_DCNodesMap.find(TrianOnLineNode.GetRailwayNodeID());
  1263. if (iter2!=m_DCNodesMap.end())
  1264. {
  1265. V = iter2->second.m_NodeV; //列车轮对节点电压V2
  1266. }
  1267. double a = iter->second.m_NodeV; //列车受电弓节点电压V1
  1268. I = TrianOnLineNode.PowerRate/(iter->second.m_NodeV-V); //列车受电弓节点电流Ii=列车消耗功率/(受电弓节点电压V1-列车轮对节点电压V2)
  1269. m_EquationCalcul.SetParam(TrianOnLineNode.m_RectIndex,m_DCNodesMap.size(),-I); //最后一列:节点注入电流Ii(-) xyx注释
  1270. }
  1271. //情形5:矩阵中列车轮对节点参数设置,含:自导Yii,互导Yij,节点注入电流Ii(+) xyx注释
  1272. else if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_DownTrain) //列车下行节点的判断
  1273. {
  1274. TRIANONRAILWAY& TrianOnRailway = iter->second.TrianOnRailway;
  1275. if (TrianOnRailway.m_RectIndex>=0&&TrianOnRailway.m_RectIndex<m_DCNodesMap.size()&&TrianOnRailway.m_RectIndex< m_nMaxSigleArrowTrainNums)
  1276. {
  1277. m_EquationCalcul.SetParam(TrianOnRailway.m_RectIndex,TrianOnRailway.m_RectIndex,TrianOnRailway.GetSelfYValue()); //主对角线元素:自导Yii xyx注释
  1278. }
  1279. for (int i =0;i<TrianOnRailway.RelationCount;i++ )
  1280. {
  1281. int relationid = TrianOnRailway.RelaNodes[i].NodeID;
  1282. double HD = TrianOnRailway.GetRelaNodeYValue(relationid);
  1283. int rectindex = GetRelaNodeRectIndex(relationid);
  1284. if (rectindex>=0&&rectindex<m_DCNodesMap.size()&&rectindex< m_nMaxSigleArrowTrainNums)
  1285. {
  1286. m_EquationCalcul.SetParam(TrianOnRailway.m_RectIndex,rectindex,HD); //非主对角线元素:互导Yij xyx注释
  1287. }
  1288. }
  1289. double I=0;
  1290. double V=0;
  1291. DCYSNODEMAP::iterator iter2 = m_DCNodesMap.find(TrianOnRailway.GetOnlineNodeID());
  1292. if (iter2!=m_DCNodesMap.end())
  1293. {
  1294. V = iter2->second.m_NodeV; //列车受电弓节点电压V1
  1295. }
  1296. I = TrianOnRailway.PowerRate/(V-iter->second.m_NodeV); //列车受电弓节点电流Ii=列车消耗功率/(受电弓节点电压V1-列车轮对节点电压V2)
  1297. double a = iter->second.m_NodeV; //列车轮对节点电压V2
  1298. m_EquationCalcul.SetParam(TrianOnRailway.m_RectIndex,m_DCNodesMap.size(),I); //最后一列:节点注入电流Ii(+) xyx注释
  1299. }
  1300. }
  1301. return true;
  1302. }
  1303. bool DCSysMG::HaveRightResult() //检测计算结果的正确性
  1304. {
  1305. return HaveResult;
  1306. //return true;
  1307. }
  1308. void DCSysMG::OutPutTrainSMap() //输出列车数据表
  1309. {
  1310. m_CritilSec.lock();
  1311. map<int,DCSysTrain>::iterator iter =TrainSInStationMap.begin();
  1312. for (;iter!=TrainSInStationMap.end();iter++)
  1313. {
  1314. DCSysTrain& trian = iter->second;
  1315. //TRACE(" OutPutTrainSMap: Trianid = %d,lineID = %d,excursion = %f,PowerRate = %f,Speed = %f\n",trian.ID,trian.LineSectionID,trian.excursion,trian.PowerRate,trian.Speed);
  1316. }
  1317. m_CritilSec.unlock();
  1318. }
  1319. bool DCSysMG::OutPutRectValueToFile() //将矩阵(a,b矩阵的值)的值输入到文件中
  1320. {
  1321. try
  1322. {
  1323. std::ofstream sfile("D:\\testdata.txt", std::ios::app);
  1324. if (!sfile) {
  1325. sfile.open("D:\\testdata.txt", std::ios::out);
  1326. if (!sfile) {
  1327. return false;
  1328. }
  1329. }
  1330. // 写入矩阵A
  1331. sfile << "Rect A Values:" << std::endl;
  1332. for (int i = 0; i < 100; i++) {
  1333. sfile << " " << i << " ";
  1334. for (int j = 0; j < 101; j++) {
  1335. sfile << " " << std::fixed << std::setprecision(3) << m_EquationCalcul.a[i][j];
  1336. }
  1337. sfile << std::endl;
  1338. }
  1339. // 写入矩阵B
  1340. sfile << "Rect B Values:" << std::endl;
  1341. for (int k = 0; k < 100; k++) {
  1342. sfile << " " << k << " ";
  1343. for (int g = 0; g < 101; g++) {
  1344. sfile << " " << std::fixed << std::setprecision(3) << m_EquationCalcul.b[k][g];
  1345. }
  1346. sfile << std::endl;
  1347. }
  1348. sfile.close();
  1349. }
  1350. catch (...)
  1351. {
  1352. //AfxMessageBox("Write File Error!");
  1353. return false;
  1354. }
  1355. return true;
  1356. }
  1357. void DCSysMG::AdjustI(double& i)//调整电流值
  1358. {
  1359. if (i<0)
  1360. {
  1361. i=-i;
  1362. }
  1363. if (i>5000)//电流值不能超过5000
  1364. {
  1365. i-=1000;
  1366. }
  1367. }
  1368. bool DCSysMG::CalculRectArray() //计算矩阵数组
  1369. {
  1370. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  1371. {
  1372. return false;
  1373. }
  1374. bool CalScope=true;
  1375. DCSTATIONMAP::iterator iter = m_PowerStationNodeMap.begin();
  1376. for (;iter!=m_PowerStationNodeMap.end();iter++)
  1377. {
  1378. iter->second.SetWorkArea(1); //设置第一个工区 //设置整流器初始运行区间为第一区间
  1379. ////xyx测试begin 设置宝华站整流机组短路
  1380. //if(iter->second.GetID()==3)
  1381. //{
  1382. // iter->second.SetFualtWorkArea();
  1383. //}
  1384. ////xyx测试end
  1385. }
  1386. int e;
  1387. for (e=0;e<Iterate_Calculate_Times;e++)//Iterate_Calculate_Times 500//计算次数
  1388. {
  1389. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  1390. {
  1391. return false;
  1392. }
  1393. CreateRectArray(); //创建节点导纳+节点注入电流矩阵 xyx注释
  1394. bool Stop=true;
  1395. m_EquationCalcul.jisuan();//计算矩阵的数据
  1396. if (!m_EquationCalcul.CheckResult()) //计算结果
  1397. {
  1398. return false;
  1399. }
  1400. // OutPutRectValueToFile();
  1401. if (CalScope)
  1402. {
  1403. DCSTATIONMAP::iterator iter1 = m_PowerStationNodeMap.begin();
  1404. for (;iter1!=m_PowerStationNodeMap.end();iter1++)
  1405. {
  1406. double V_RectierToTouchnet=0; //整流器到接触网的电压
  1407. double V_RectierToRailway=0; //整流器到轨道的电压
  1408. Dc_PowerStation& powerstation = iter1->second;
  1409. DCYSNODEMAP::iterator iter2= m_DCNodesMap.find(powerstation.GetRectierToTouchNetNodeID()); //直流正极母线节点 xyx注释
  1410. if (iter2!=m_DCNodesMap.end())
  1411. {
  1412. int id=iter2->second.NodeID;
  1413. //从矩阵b中找出对应的数据,根据ID号对应点所存的数据进行提取
  1414. V_RectierToTouchnet=m_EquationCalcul.b[iter2->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1415. }
  1416. DCYSNODEMAP::iterator iter3= m_DCNodesMap.find(powerstation.GetRectierToRailwayNodeID()); //直流负极母线节点 xyx注释
  1417. if (iter3!=m_DCNodesMap.end())
  1418. {
  1419. V_RectierToRailway=m_EquationCalcul.b[iter3->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1420. }
  1421. //整流器负荷电流i=(负极母线电压+整流器工区压-正极母线电压)/整流器内阻 xyx注释
  1422. double i=(V_RectierToRailway+powerstation.GetWorkAreaV()-V_RectierToTouchnet)/powerstation.GetInnerR();
  1423. //电流的计算方法为:整流器到轨道的电压+相应的工区电压-整流器到接触网的电压/电站内阻
  1424. if (i<0)
  1425. {
  1426. i=-i;
  1427. }
  1428. //xyx新增begin 根据直流母线带电状态确定是否调整工区
  1429. ELEEQPMTMAP::iterator iterRectierToTouchNet =ElectricEqpmtMap.find(iter1->second.GetRectierToTouchNetUnitID());
  1430. if (iterRectierToTouchNet!=ElectricEqpmtMap.end())
  1431. {
  1432. if (!iterRectierToTouchNet->second->GetPower())
  1433. {
  1434. POWERNODE PowerNode;
  1435. //PowerNode.m_NodeV=0.0;
  1436. iter1->second.SetNoWorkArea(false);
  1437. DCYSNODEMAP::iterator iterRecToTouchNet= m_DCNodesMap.find(iter1->second.GetRectierToTouchNetNodeID());
  1438. if (iterRecToTouchNet!=m_DCNodesMap.end())
  1439. {
  1440. iterRecToTouchNet->second.RectierToTouchNetNode.SetPower(false);
  1441. iterRecToTouchNet->second.RectierToTouchNetNode.SetInnerNode(iter1->second.GetRectierToRailwayNodeID(),iter1->second.GetInnerR(),iterRecToTouchNet->second.RectierToTouchNetNode.GetPower());
  1442. }
  1443. DCYSNODEMAP::iterator iterRecToRailway= m_DCNodesMap.find(iter1->second.GetRectierToRailwayNodeID());
  1444. if (iterRecToRailway!=m_DCNodesMap.end())
  1445. {
  1446. iterRecToRailway->second.RectierToRailwayNode.SetPower(false);
  1447. iterRecToRailway->second.RectierToRailwayNode.SetInnerNode(iter1->second.GetRectierToTouchNetNodeID(),iter1->second.GetInnerR(),iterRecToRailway->second.RectierToRailwayNode.GetPower());
  1448. }
  1449. }
  1450. else
  1451. {
  1452. FindCalScope(powerstation,Stop,i); //判断整流机组负荷电流是否在器工作区间对应的负荷电流范围内 xyx注释
  1453. }
  1454. }
  1455. //xyx新增end
  1456. //FindCalScope(powerstation,Stop,i); //判断整流机组负荷电流是否在器工作区间对应的负荷电流范围内 xyx注释
  1457. }
  1458. }
  1459. else
  1460. {
  1461. DCYSNODEMAP::iterator iter4=m_DCNodesMap.begin();
  1462. for (;iter4!=m_DCNodesMap.end();iter4++)
  1463. {
  1464. if (iter4->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_UpTrain) //列车受电弓节点 xyx注释
  1465. {
  1466. double v=0;
  1467. double v1=0;
  1468. DCYSNODEMAP::iterator iter5 = m_DCNodesMap.find(iter4->second.TrianOnLineNode.GetRailwayNodeID()); //当前受电弓节点对应的轮对节点 xyx注释
  1469. if (iter5!=m_DCNodesMap.end())
  1470. {
  1471. v = iter4->second.m_NodeV-iter5->second.m_NodeV;//此处电压的计算方法是??? //初始列车电压v=受电弓电压-轮对电压 xyx注释
  1472. }
  1473. // v1=m_EquationCalcul.b[iter4->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1474. //根据矩阵计算方法获取电压值
  1475. //节点电压法计算所得列车电压v1 xyx注释
  1476. v1=m_EquationCalcul.b[iter4->second.GetRectIndex()][m_EquationCalcul.lie-1]-m_EquationCalcul.b[iter5->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1477. //判断计算出的各个列车节点电压大小是否已满足给定的收敛精度:|v-v1|<收敛精度Voltage_Calculate_Offsize xyx注释
  1478. //若不满足精度要求,则将计算得到的电压值v1赋给当前节点 xyx注释
  1479. double vi=v-v1;
  1480. if (v-v1>Voltage_Calculate_Offsize||v-v1<-Voltage_Calculate_Offsize)//电压计算误差
  1481. {
  1482. Stop=false; //继续迭代 xyx注释
  1483. CalScope=true; //进入下一次迭代计算,将整理机组工区设置为第一区间重新迭代计算 xyx注释
  1484. }
  1485. iter4->second.m_NodeV=m_EquationCalcul.b[iter4->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1486. }
  1487. if (iter4->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_DownTrain)
  1488. {
  1489. iter4->second.m_NodeV=m_EquationCalcul.b[iter4->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1490. }
  1491. }
  1492. if (CalScope)
  1493. {
  1494. DCSTATIONMAP::iterator iter = m_PowerStationNodeMap.begin();
  1495. for (;iter!=m_PowerStationNodeMap.end();iter++)
  1496. {
  1497. iter->second.SetWorkArea(1);
  1498. }
  1499. }
  1500. }
  1501. if (Stop) //若列车节点电压满足精度要求 xyx注释
  1502. {
  1503. if (CalScope)
  1504. {
  1505. CalScope=false; //则不需要进行整流机组的工区调整 xyx注释
  1506. }
  1507. else
  1508. break;
  1509. }
  1510. }
  1511. //以下为计算结果收敛后,根据潮流计算结果进一步计算得到其他电量值 xyx注释
  1512. if (e<=Iterate_Calculate_Times)//#define Iterate_Calculate_Times 500//计算次数
  1513. {
  1514. if (p_PQValueArr!=nullptr)
  1515. {
  1516. DCSTATIONMAP::iterator iter1 = m_PowerStationNodeMap.begin();
  1517. for (;iter1!=m_PowerStationNodeMap.end();iter1++)
  1518. {
  1519. Dc_PowerStation& powerstation = iter1->second;
  1520. //double V_RectierToTouchnet=0;
  1521. //double V_RectierToRailway=0;
  1522. double V_RectierToTouchnet=0;
  1523. double V_RectierToRailway=0;
  1524. //(1)直流正极母线节点电压 xyx注释
  1525. DCYSNODEMAP::iterator iter2= m_DCNodesMap.find(powerstation.GetRectierToTouchNetNodeID());
  1526. if (iter2!=m_DCNodesMap.end())
  1527. {
  1528. V_RectierToTouchnet=m_EquationCalcul.b[iter2->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1529. }
  1530. //(2)直流负极母线节点电压 xyx注释
  1531. DCYSNODEMAP::iterator iter3= m_DCNodesMap.find(powerstation.GetRectierToRailwayNodeID());
  1532. if (iter3!=m_DCNodesMap.end())
  1533. {
  1534. V_RectierToRailway=m_EquationCalcul.b[iter3->second.GetRectIndex()][m_EquationCalcul.lie-1];
  1535. }
  1536. //(3)整流机组电流 xyx注释
  1537. double i=(V_RectierToRailway+powerstation.GetWorkAreaV()-V_RectierToTouchnet)/powerstation.GetInnerR();
  1538. AdjustI(i);//调整电流值
  1539. for (int k=0;k < m_nAllPowerStationNums;k++)
  1540. {
  1541. if (p_PQValueArr[k].StationID==powerstation.GetID())
  1542. {
  1543. p_PQValueArr[k].P_QY = powerstation.GetWorkAreaV()*i;//整流机组的有功功率 xyx注释
  1544. p_PQValueArr[k].Q_QY = p_PQValueArr[k].P_QY/0.97*0.2431;//无功功率=有功功率*tanφ=P*[sqr(1-cosφ*cosφ)]/cosφ,其中cosφ为牵混所功率因数(=0.97) xyx注释
  1545. double a=p_PQValueArr[k].P_QY;
  1546. double b=p_PQValueArr[k].Q_QY;
  1547. }
  1548. }
  1549. //xyx新增 begin 以下为:将计算结果赋给相应的图元
  1550. //(1)直流正极母线图元电压
  1551. ELEEQPMTMAP::iterator iterRectierToTouchNetUnit = ElectricEqpmtMap.find(iter1->second.GetRectierToTouchNetUnitID());
  1552. if (iterRectierToTouchNetUnit!=ElectricEqpmtMap.end())
  1553. {
  1554. if(iterRectierToTouchNetUnit->second->GetPower())
  1555. {
  1556. iterRectierToTouchNetUnit->second->m_EqpmtPowerValue.U = V_RectierToTouchnet;
  1557. }
  1558. else
  1559. {
  1560. iterRectierToTouchNetUnit->second->m_EqpmtPowerValue.U = 0.0;
  1561. }
  1562. iterRectierToTouchNetUnit->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_DCBus; //3代表母线不区分I、II段
  1563. }
  1564. //(2)将直流正极母线节点电压、整流机组电流分流值计算结果->赋给相应的直流馈线断路器
  1565. //(2-1)上行前一馈线断路器
  1566. double Breaker_I=V_RectierToTouchnet/powerstation.GetInnerR()/100;
  1567. ELEEQPMTMAP::iterator iterFeedUpPreBreakerUnit = ElectricEqpmtMap.find(iter1->second.GetFeedUpPreBreakerID());
  1568. if (iterFeedUpPreBreakerUnit!=ElectricEqpmtMap.end())
  1569. {
  1570. if(iterFeedUpPreBreakerUnit->second->GetPower())
  1571. {
  1572. iterFeedUpPreBreakerUnit->second->m_EqpmtPowerValue.U = V_RectierToTouchnet;
  1573. iterFeedUpPreBreakerUnit->second->m_EqpmtPowerValue.I = Breaker_I/4;
  1574. }
  1575. else
  1576. {
  1577. iterFeedUpPreBreakerUnit->second->m_EqpmtPowerValue.U = 0.0;
  1578. iterFeedUpPreBreakerUnit->second->m_EqpmtPowerValue.I = 0.0;
  1579. }
  1580. iterFeedUpPreBreakerUnit->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_Eqpmt;
  1581. }
  1582. //(2-2)上行后一馈线断路器
  1583. ELEEQPMTMAP::iterator iterFeedUpNextBreakerUnit = ElectricEqpmtMap.find(iter1->second.GetFeedUpNextBreakerID());
  1584. if (iterFeedUpNextBreakerUnit!=ElectricEqpmtMap.end())
  1585. {
  1586. if(iterFeedUpNextBreakerUnit->second->GetPower())
  1587. {
  1588. iterFeedUpNextBreakerUnit->second->m_EqpmtPowerValue.U = V_RectierToTouchnet;
  1589. iterFeedUpNextBreakerUnit->second->m_EqpmtPowerValue.I = Breaker_I/4;
  1590. }
  1591. else
  1592. {
  1593. iterFeedUpNextBreakerUnit->second->m_EqpmtPowerValue.U = 0.0;
  1594. iterFeedUpNextBreakerUnit->second->m_EqpmtPowerValue.I = 0.0;
  1595. }
  1596. iterFeedUpNextBreakerUnit->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_Eqpmt;
  1597. }
  1598. //(2-3)下行前一馈线断路器
  1599. ELEEQPMTMAP::iterator iterFeedDownPreBreakerUnit = ElectricEqpmtMap.find(iter1->second.GetFeedDownPreBreakerID());
  1600. if (iterFeedDownPreBreakerUnit!=ElectricEqpmtMap.end())
  1601. {
  1602. if(iterFeedDownPreBreakerUnit->second->GetPower())
  1603. {
  1604. iterFeedDownPreBreakerUnit->second->m_EqpmtPowerValue.U = V_RectierToTouchnet;
  1605. iterFeedDownPreBreakerUnit->second->m_EqpmtPowerValue.I = Breaker_I/4;
  1606. }
  1607. else
  1608. {
  1609. iterFeedDownPreBreakerUnit->second->m_EqpmtPowerValue.U = 0.0;
  1610. iterFeedDownPreBreakerUnit->second->m_EqpmtPowerValue.I = 0.0;
  1611. }
  1612. iterFeedDownPreBreakerUnit->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_Eqpmt;
  1613. }
  1614. //(2-4)下行后一馈线断路器
  1615. ELEEQPMTMAP::iterator iterFeedDownNextBreakerUnit = ElectricEqpmtMap.find(iter1->second.GetFeedDownNextBreakerID());
  1616. if (iterFeedDownNextBreakerUnit!=ElectricEqpmtMap.end())
  1617. {
  1618. if(iterFeedDownNextBreakerUnit->second->GetPower())
  1619. {
  1620. iterFeedDownNextBreakerUnit->second->m_EqpmtPowerValue.U = V_RectierToTouchnet;
  1621. iterFeedDownNextBreakerUnit->second->m_EqpmtPowerValue.I = Breaker_I/4;
  1622. }
  1623. else
  1624. {
  1625. iterFeedDownNextBreakerUnit->second->m_EqpmtPowerValue.U = 0.0;
  1626. iterFeedDownNextBreakerUnit->second->m_EqpmtPowerValue.I = 0.0;
  1627. }
  1628. iterFeedDownNextBreakerUnit->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_Eqpmt;
  1629. }
  1630. //(3)将直流正极母线节点电压计算结果赋给相应的直流进线开关图元
  1631. //(3-1)直流进线开关I
  1632. ELEEQPMTMAP::iterator itertFirstDCInputBreakerUnit = ElectricEqpmtMap.find(iter1->second.GetFirstDCInputBreakerUnitID());
  1633. if (itertFirstDCInputBreakerUnit!=ElectricEqpmtMap.end())
  1634. {
  1635. if (itertFirstDCInputBreakerUnit->second->GetPower())
  1636. {
  1637. itertFirstDCInputBreakerUnit->second->m_EqpmtPowerValue.U = V_RectierToTouchnet;
  1638. itertFirstDCInputBreakerUnit->second->m_EqpmtPowerValue.I = Breaker_I/2;
  1639. }
  1640. else
  1641. {
  1642. itertFirstDCInputBreakerUnit->second->m_EqpmtPowerValue.U = 0.0;
  1643. itertFirstDCInputBreakerUnit->second->m_EqpmtPowerValue.I = 0.0;
  1644. }
  1645. itertFirstDCInputBreakerUnit->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_Eqpmt;
  1646. }
  1647. //(3-2)直流进线开关II
  1648. ELEEQPMTMAP::iterator itertSecondDCInputBreakerUnit = ElectricEqpmtMap.find(iter1->second.GetSecondDCInputBreakerUnitID());
  1649. if (itertSecondDCInputBreakerUnit!=ElectricEqpmtMap.end())
  1650. {
  1651. if (itertSecondDCInputBreakerUnit->second->GetPower())
  1652. {
  1653. itertSecondDCInputBreakerUnit->second->m_EqpmtPowerValue.U = V_RectierToTouchnet;
  1654. itertSecondDCInputBreakerUnit->second->m_EqpmtPowerValue.I = Breaker_I/2;
  1655. }
  1656. else
  1657. {
  1658. itertSecondDCInputBreakerUnit->second->m_EqpmtPowerValue.U = 0.0;
  1659. itertSecondDCInputBreakerUnit->second->m_EqpmtPowerValue.I = 0.0;
  1660. }
  1661. itertSecondDCInputBreakerUnit->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_Eqpmt;
  1662. }
  1663. //(4)将直流负极母线节点电压计算结果赋给相应的母线图元
  1664. ELEEQPMTMAP::iterator itertRectierToRailwayUnit = ElectricEqpmtMap.find(iter1->second.GetRectierToRailwayUnitID());
  1665. if (itertRectierToRailwayUnit!=ElectricEqpmtMap.end())
  1666. {
  1667. itertRectierToRailwayUnit->second->m_EqpmtPowerValue.U = V_RectierToRailway;
  1668. itertRectierToRailwayUnit->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_DCBus;
  1669. }
  1670. //xyx新增 end
  1671. }
  1672. }
  1673. HaveResult =true;
  1674. }
  1675. return true;
  1676. }
  1677. //以下功能为:根据计算出的整流器负荷电流值判断是否需要调整整流器运行区间 xyx注释
  1678. void DCSysMG::FindCalScope(Dc_PowerStation& node,bool& stop,double i)//查询计算范围
  1679. {//在指定的工区内设定相应的轨道与接触网区段,InnerR为内阻即工区电阻,
  1680. double ivalue = node.GetPWorkAreaI();
  1681. //情形1:若某整流器计算出的负荷电流i大于当前工作区间对应的负荷电流范围,则调整该整流机组的工作区间为后一区间 xyx注释
  1682. if (i>node.GetWorkAreaI()&&node.GetWorkArea()<6)//只能计算五个工区的值(出自王~大论文P22)
  1683. {
  1684. stop=false;
  1685. node.SetWorkArea(node.GetWorkArea()+1);
  1686. int n1 = node.GetRectierToTouchNetNodeID();
  1687. DCYSNODEMAP::iterator iter2= m_DCNodesMap.find(node.GetRectierToTouchNetNodeID());
  1688. if (iter2!=m_DCNodesMap.end())
  1689. {
  1690. iter2->second.RectierToTouchNetNode.SetInnerNode(node.GetRectierToRailwayNodeID(),node.GetInnerR(),true);
  1691. }
  1692. int n2 = node.GetRectierToRailwayNodeID();
  1693. DCYSNODEMAP::iterator iter3= m_DCNodesMap.find(node.GetRectierToRailwayNodeID());
  1694. if (iter3!=m_DCNodesMap.end())
  1695. {
  1696. iter3->second.RectierToRailwayNode.SetInnerNode(node.GetRectierToTouchNetNodeID(),node.GetInnerR(),true);
  1697. }
  1698. }
  1699. //情形2:若某整流器计算出的负荷电流i小于当前工作区间对应的负荷电流范围,则调整该整流机组的工作区间为前一区间 xyx注释
  1700. else if (i<=node.GetPWorkAreaI())
  1701. {
  1702. stop=false;
  1703. node.SetWorkArea(node.GetWorkArea()-1);
  1704. int n3 = node.GetRectierToTouchNetNodeID();
  1705. DCYSNODEMAP::iterator iter2= m_DCNodesMap.find(node.GetRectierToTouchNetNodeID());
  1706. if (iter2!=m_DCNodesMap.end())
  1707. {
  1708. iter2->second.RectierToTouchNetNode.SetInnerNode(node.GetRectierToRailwayNodeID(),node.GetInnerR(),true);
  1709. }
  1710. DCYSNODEMAP::iterator iter3= m_DCNodesMap.find(node.GetRectierToRailwayNodeID());
  1711. int n4 = node.GetRectierToTouchNetNodeID();
  1712. if (iter3!=m_DCNodesMap.end())
  1713. {
  1714. iter3->second.RectierToRailwayNode.SetInnerNode(node.GetRectierToTouchNetNodeID(),node.GetInnerR(),true);
  1715. }
  1716. }
  1717. }
  1718. bool DCSysMG::AdjustFixNodeRect(DCYSNODEMAP& NodeMap) //调整固定节点矩阵的信息
  1719. {
  1720. m_CritilSecSpanNet.lock();//?m_CritilSecSpanNet
  1721. for (size_t i=0;i<m_TouchNetSpanNetInfo.size();i++)
  1722. {
  1723. AdjustSpanNetNode(m_TouchNetSpanNetInfo[i]);//根据跨网与接触网的关系设置跨网的节点信息
  1724. }
  1725. m_CritilSecSpanNet.unlock();
  1726. //AdjustShortCutNode();//调整短路节点
  1727. return true;
  1728. }
  1729. bool DCSysMG::AdjustSpanNetNode(TouchNet_SpanNetApplyPower_Info& AdjustNode)//根据接触网与跨网的供电信息调整跨网节点//TouchNet_SpanNetApplyPower_Info?
  1730. {
  1731. //更新不同列车运行方向的跨网信息,将前段与下段的长度作为跨网的长度,下一段的ID号作为跨网的ID号,前段的ID号不用,设为-1
  1732. DCYSNODEMAP::iterator iter = m_DCNodesMap.find(AdjustNode.nodeid);
  1733. if (iter!=m_DCNodesMap.end())
  1734. {
  1735. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  1736. {
  1737. return false;
  1738. }
  1739. if (iter->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1740. {
  1741. if (AdjustNode.arrow==TRAIN_DIR_UP)//上行方向
  1742. {
  1743. double len = iter->second.RectierToTouchNetNode.GetUpPreNodeLen();//GetUpPreNodeLen()?
  1744. len+=iter->second.RectierToTouchNetNode.GetUpNextNodeLen();//跨网长度的计算:整流器到接触网的前后节点间的距离
  1745. DCYSNODEMAP::iterator iterpre = m_DCNodesMap.find(iter->second.RectierToTouchNetNode.GetUpPreNodeID());
  1746. if (iterpre!=m_DCNodesMap.end())
  1747. {
  1748. if (iterpre->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1749. {
  1750. //将前一站的直流母线节点的下一个节点设置为当前站直流母线节点的下一个母线节点(后一站的直流母线节点),即:去除(跳过)当前站直流母线节点 xyx注释
  1751. iterpre->second.RectierToTouchNetNode.SetUpNextNode(iter->second.RectierToTouchNetNode.GetUpNextNodeID(),len,true);
  1752. //将当前站的前一直流母线节点参数去除 xyx注释
  1753. iter->second.RectierToTouchNetNode.SetUpPreNode(-1,0,false);//SetUpPreNode(-1,0)
  1754. }
  1755. }
  1756. DCYSNODEMAP::iterator iternext = m_DCNodesMap.find(iter->second.RectierToTouchNetNode.GetUpNextNodeID());
  1757. if (iternext!=m_DCNodesMap.end())
  1758. {
  1759. if (iternext->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1760. {
  1761. //将后一站的直流母线节点的上一个节点设置为当前站直流母线节点的上一个母线节点(前一站的直流母线节点),即:去除(跳过)当前站直流母线节点 xyx注释
  1762. iternext->second.RectierToTouchNetNode.SetUpPreNode(iter->second.RectierToTouchNetNode.GetUpPreNodeID(),len,true);
  1763. //将当前站的后一直流母线节点参数去除 xyx注释
  1764. iter->second.RectierToTouchNetNode.SetUpNextNode(-1,0,false);
  1765. }
  1766. }
  1767. for (size_t i=0;i<m_UpRunFixDataList.size();i++)
  1768. {
  1769. if (m_UpRunFixDataList[i].ID==AdjustNode.nodeid)
  1770. {
  1771. m_UpRunFixDataList.erase(m_UpRunFixDataList.begin()+i); //将当前站上行直流母线节点从上行固定节点中删除
  1772. }
  1773. }
  1774. }
  1775. else if (AdjustNode.arrow==TRAIN_DIR_DOWN)//下行方向:与上行节点同理
  1776. {
  1777. double len = iter->second.RectierToTouchNetNode.GetDownPreNodeLen();
  1778. len+=iter->second.RectierToTouchNetNode.GetDownNextNodeLen();
  1779. DCYSNODEMAP::iterator iterpre = m_DCNodesMap.find(iter->second.RectierToTouchNetNode.GetDownPreNodeID());
  1780. if (iterpre!=m_DCNodesMap.end())
  1781. {
  1782. if (iterpre->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1783. {
  1784. iterpre->second.RectierToTouchNetNode.SetDownNextNode(iter->second.RectierToTouchNetNode.GetDownNextNodeID(),len,true);
  1785. iter->second.RectierToTouchNetNode.SetDownPreNode(-1,0,false);
  1786. }
  1787. }
  1788. DCYSNODEMAP::iterator iternext = m_DCNodesMap.find(iter->second.RectierToTouchNetNode.GetDownNextNodeID());
  1789. if (iternext!=m_DCNodesMap.end())
  1790. {
  1791. if (iternext->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1792. {
  1793. iternext->second.RectierToTouchNetNode.SetDownPreNode(iter->second.RectierToTouchNetNode.GetDownPreNodeID(),len,true);
  1794. iter->second.RectierToTouchNetNode.SetDownNextNode(-1,0,false);
  1795. }
  1796. }
  1797. for (size_t i=0;i<m_DownFixRunDataList.size();i++)
  1798. {
  1799. if (m_DownFixRunDataList[i].ID==AdjustNode.nodeid)
  1800. {
  1801. m_DownFixRunDataList.erase(m_DownFixRunDataList.begin()+i);
  1802. }
  1803. }
  1804. }
  1805. else //根据直流进线开关的带电状态确认是否进行直流母线越区供电,若两个直流进线开关均为无电状态,则说明整流机组不工作,上下行均进行越区供电 xyx注释
  1806. {
  1807. //上行
  1808. double lenup = iter->second.RectierToTouchNetNode.GetUpPreNodeLen();//GetUpPreNodeLen()?
  1809. lenup+=iter->second.RectierToTouchNetNode.GetUpNextNodeLen();//跨网长度的计算:整流器到接触网的前后节点间的距离
  1810. DCYSNODEMAP::iterator iterpre1 = m_DCNodesMap.find(iter->second.RectierToTouchNetNode.GetUpPreNodeID());
  1811. if (iterpre1!=m_DCNodesMap.end())
  1812. {
  1813. if (iterpre1->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1814. {
  1815. //将前一站的直流母线节点的下一个节点设置为当前站直流母线节点的下一个母线节点(后一站的直流母线节点),即:去除(跳过)当前站直流母线节点 xyx注释
  1816. iterpre1->second.RectierToTouchNetNode.SetUpNextNode(iter->second.RectierToTouchNetNode.GetUpNextNodeID(),lenup,true);
  1817. //将当前站的前一直流母线节点参数去除 xyx注释
  1818. iter->second.RectierToTouchNetNode.SetUpPreNode(-1,0,false);//SetUpPreNode(-1,0)
  1819. }
  1820. }
  1821. DCYSNODEMAP::iterator iternext1 = m_DCNodesMap.find(iter->second.RectierToTouchNetNode.GetUpNextNodeID());
  1822. if (iternext1!=m_DCNodesMap.end())
  1823. {
  1824. if (iternext1->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1825. {
  1826. //将后一站的直流母线节点的上一个节点设置为当前站直流母线节点的上一个母线节点(前一站的直流母线节点),即:去除(跳过)当前站直流母线节点 xyx注释
  1827. iternext1->second.RectierToTouchNetNode.SetUpPreNode(iter->second.RectierToTouchNetNode.GetUpPreNodeID(),lenup,true);
  1828. //将当前站的后一直流母线节点参数去除 xyx注释
  1829. iter->second.RectierToTouchNetNode.SetUpNextNode(-1,0,false);
  1830. }
  1831. }
  1832. for (size_t i=0;i<m_UpRunFixDataList.size();i++)
  1833. {
  1834. if (m_UpRunFixDataList[i].ID==AdjustNode.nodeid)
  1835. {
  1836. m_UpRunFixDataList.erase(m_UpRunFixDataList.begin()+i); //将当前站上行直流母线节点从上行固定节点中删除
  1837. }
  1838. }
  1839. //下行
  1840. double lendown = iter->second.RectierToTouchNetNode.GetDownPreNodeLen();
  1841. lendown+=iter->second.RectierToTouchNetNode.GetDownNextNodeLen();
  1842. DCYSNODEMAP::iterator iterpre2 = m_DCNodesMap.find(iter->second.RectierToTouchNetNode.GetDownPreNodeID());
  1843. if (iterpre2!=m_DCNodesMap.end())
  1844. {
  1845. if (iterpre2->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1846. {
  1847. iterpre2->second.RectierToTouchNetNode.SetDownNextNode(iter->second.RectierToTouchNetNode.GetDownNextNodeID(),lendown,true);
  1848. iter->second.RectierToTouchNetNode.SetDownPreNode(-1,0,false);
  1849. }
  1850. }
  1851. DCYSNODEMAP::iterator iternext2 = m_DCNodesMap.find(iter->second.RectierToTouchNetNode.GetDownNextNodeID());
  1852. if (iternext2!=m_DCNodesMap.end())
  1853. {
  1854. if (iternext2->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1855. {
  1856. iternext2->second.RectierToTouchNetNode.SetDownPreNode(iter->second.RectierToTouchNetNode.GetDownPreNodeID(),lendown,true);
  1857. iter->second.RectierToTouchNetNode.SetDownNextNode(-1,0,false);
  1858. }
  1859. }
  1860. for (size_t i=0;i<m_DownFixRunDataList.size();i++)
  1861. {
  1862. if (m_DownFixRunDataList[i].ID==AdjustNode.nodeid)
  1863. {
  1864. m_DownFixRunDataList.erase(m_DownFixRunDataList.begin()+i);
  1865. }
  1866. }
  1867. }
  1868. }
  1869. }
  1870. return true;
  1871. }
  1872. bool DCSysMG::AdjustShortCutNode() //是否调整短路节点
  1873. {
  1874. //if ( !m_bInit)
  1875. //{
  1876. // return false;
  1877. //}
  1878. //xyx新增 begin
  1879. TOUCHNETMAP::iterator iterTouchNet = TouchNetMap.begin();
  1880. //if (iterTouchNet!=TouchNetMap.end())
  1881. for(;iterTouchNet!=TouchNetMap.end();iterTouchNet++)
  1882. {
  1883. if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)
  1884. {
  1885. return false;
  1886. }
  1887. CElectricEqpmt_Line_TouchNet*TouchNet=iterTouchNet->second;
  1888. DCSTATIONMAP::iterator iterStartStation = m_PowerStationNodeMap.find(TouchNet->GetStartStation());//当前接触网连接的始端站
  1889. DCSTATIONMAP::iterator iterEndStation = m_PowerStationNodeMap.find(TouchNet->GetEndStation());//当前接触网连接的末端站
  1890. if (iterStartStation==m_PowerStationNodeMap.end()||iterEndStation==m_PowerStationNodeMap.end())
  1891. {
  1892. break;
  1893. }
  1894. DCYSNODEMAP::iterator iterStartNode = m_DCFixNodesMap.find(iterStartStation->second.GetRectierToTouchNetNodeID());//始端站的直流正极母线节点
  1895. DCYSNODEMAP::iterator iterEndNode = m_DCFixNodesMap.find(iterEndStation->second.GetRectierToTouchNetNodeID()); //末端站的直流正极母线节点
  1896. bool TouchNetPower = true; //获取当前接触网的带电状态
  1897. ELEEQPMTMAP:: iterator iterTouchNetUnitID = ElectricEqpmtMap.find(iterTouchNet->first);
  1898. if (iterTouchNetUnitID!=ElectricEqpmtMap.end())
  1899. {
  1900. TouchNetPower = iterTouchNetUnitID->second->GetPower();
  1901. }
  1902. //上行直流正极母线节点处理
  1903. if (iterTouchNet->second->GetRunDirection()==TRAIN_DIR_UP)
  1904. {
  1905. //(1)当前上行接触网连接的始端断路器开关状态
  1906. bool UpStartBreakerStatus = true;
  1907. if (iterStartStation!=m_PowerStationNodeMap.end())
  1908. {
  1909. ELEEQPMTMAP:: iterator iterUpStartBreaker = ElectricEqpmtMap.find(iterStartStation->second.GetFeedUpNextBreakerID()); //当前上行接触网连接的始端断路器为始端站的上行后一直流馈线断路器
  1910. if (iterUpStartBreaker!=ElectricEqpmtMap.end())
  1911. {
  1912. if (!iterUpStartBreaker->second->GetPower())
  1913. {
  1914. UpStartBreakerStatus = false;
  1915. }
  1916. }
  1917. }
  1918. //(2)当前上行接触网连接的尾端断路器开关状态
  1919. bool UpEndBreakerStatus = true;
  1920. if (iterEndStation!=m_PowerStationNodeMap.end())
  1921. {
  1922. ELEEQPMTMAP:: iterator iterUpEndBreaker = ElectricEqpmtMap.find(iterEndStation->second.GetFeedUpPreBreakerID()); //当前上行接触网连接的末端断路器为末端站的上行前一直流馈线断路器
  1923. if (iterUpEndBreaker!=ElectricEqpmtMap.end())
  1924. {
  1925. if (!iterUpEndBreaker->second->GetPower())
  1926. {
  1927. UpEndBreakerStatus = false;
  1928. }
  1929. }
  1930. }
  1931. //(3)直流正极母线节点前后关系调整
  1932. if (iterTouchNet->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet)
  1933. {
  1934. if (TouchNetPower) //接触网有电
  1935. {
  1936. if ( UpStartBreakerStatus==false && UpEndBreakerStatus==true ) //始端断路器不带电,末端断路器带电,接触网有电
  1937. {
  1938. if (iterStartNode!=m_DCFixNodesMap.end()&& iterStartNode->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1939. {
  1940. iterStartNode->second.RectierToTouchNetNode.SetUpNextNode(-1,0,false); //将其下一节点参数设为0
  1941. }
  1942. }
  1943. else if (UpStartBreakerStatus==true && UpEndBreakerStatus==false ) //始端断路器带电,末端断路器不带电,接触网有电
  1944. {
  1945. if (iterEndNode!=m_DCFixNodesMap.end()&& iterEndNode->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1946. {
  1947. iterEndNode->second.RectierToTouchNetNode.SetUpPreNode(-1,0,false);
  1948. }
  1949. }
  1950. }
  1951. else if (!TouchNetPower) //接触网无电,且两端断路器均无电
  1952. {
  1953. if ( UpStartBreakerStatus==false && UpEndBreakerStatus==false )
  1954. {
  1955. if (iterStartNode!=m_DCFixNodesMap.end()&& iterStartNode->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet
  1956. &&iterEndNode!=m_DCFixNodesMap.end()&& iterEndNode->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  1957. {
  1958. iterStartNode->second.RectierToTouchNetNode.SetUpNextNode(-1,0,false);
  1959. iterEndNode->second.RectierToTouchNetNode.SetUpPreNode(-1,0,false);
  1960. }
  1961. }
  1962. }
  1963. }
  1964. //(4)将始端站的直流母线节点设为头节点,末端站的直流母线节点设为尾节点
  1965. //if (UpStartBreakerStatus==false || UpEndBreakerStatus==false) //若当前接触网的始端断路器和末端断路器有任一为无电状态,则作下列处理
  1966. //{
  1967. // LineNodeData TailNode; //将始端站的直流母线设为尾节点
  1968. // TailNode.ID = iterStartStation->second.GetRectierToTouchNetNodeID();
  1969. // TailNode.Kind = Dc_NodeKind_UPTail;
  1970. // TailNode.TouchNetID = iterTouchNet->first;
  1971. // TailNode.excursion = 0;
  1972. // m_UpRunFixDataList.push_back(TailNode);
  1973. // LineNodeData HeadNode; //将尾端站的直流母线设为头节点
  1974. // HeadNode.ID = iterEndStation->second.GetRectierToTouchNetNodeID();
  1975. // HeadNode.Kind = Dc_NodeKind_UPHead;
  1976. // HeadNode.TouchNetID = iterTouchNet->first;
  1977. // HeadNode.excursion = 0;
  1978. // m_UpRunFixDataList.push_back(HeadNode);
  1979. //}
  1980. }
  1981. //下行直流正极母线节点处理:与上行同理
  1982. else if (iterTouchNet->second->GetRunDirection()==TRAIN_DIR_DOWN)
  1983. {
  1984. //(1)当前下行接触网连接的始端断路器开关状态
  1985. bool DownStartBreakerStatus = true;
  1986. if (iterStartStation!=m_PowerStationNodeMap.end())
  1987. {
  1988. ELEEQPMTMAP:: iterator iterDownStartBreaker = ElectricEqpmtMap.find(iterStartStation->second.GetFeedDownNextBreakerID()); //当前下行接触网连接的始端断路器为始端站的下行后一直流馈线断路器
  1989. if (iterDownStartBreaker!=ElectricEqpmtMap.end())
  1990. {
  1991. if (!iterDownStartBreaker->second->GetPower())
  1992. {
  1993. DownStartBreakerStatus = false;
  1994. }
  1995. }
  1996. }
  1997. //(2)当前下行接触网连接的尾端断路器开关状态
  1998. bool DownEndBreakerStatus = true;
  1999. if (iterEndStation!=m_PowerStationNodeMap.end())
  2000. {
  2001. ELEEQPMTMAP:: iterator iterDownEndBreaker = ElectricEqpmtMap.find(iterEndStation->second.GetFeedDownPreBreakerID()); //当前下行接触网连接的末端断路器为末端站的下行前一直流馈线断路器
  2002. if (iterDownEndBreaker!=ElectricEqpmtMap.end())
  2003. {
  2004. if (!iterDownEndBreaker->second->GetPower())
  2005. {
  2006. DownEndBreakerStatus = false;
  2007. }
  2008. }
  2009. }
  2010. //(3)直流正极母线节点前后关系调整
  2011. if (iterTouchNet->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet)
  2012. {
  2013. if (TouchNetPower) //接触网有电
  2014. {
  2015. if ( DownStartBreakerStatus==false && DownEndBreakerStatus==true ) //始端断路器不带电,末端断路器带电,接触网有电
  2016. {
  2017. if (iterStartNode!=m_DCFixNodesMap.end()&& iterStartNode->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  2018. {
  2019. iterStartNode->second.RectierToTouchNetNode.SetUpNextNode(-1,0,false);
  2020. }
  2021. }
  2022. else if (DownStartBreakerStatus==true && DownEndBreakerStatus==false ) //始端断路器带电,末端断路器不带电,接触网有电
  2023. {
  2024. if (iterEndNode!=m_DCFixNodesMap.end()&& iterEndNode->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  2025. {
  2026. iterEndNode->second.RectierToTouchNetNode.SetUpPreNode(-1,0,false);
  2027. }
  2028. }
  2029. }
  2030. else if (!TouchNetPower) //接触网无电,且两端断路器均无电
  2031. {
  2032. if ( DownStartBreakerStatus==false && DownEndBreakerStatus==false )
  2033. {
  2034. if (iterStartNode!=m_DCFixNodesMap.end()&& iterStartNode->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet
  2035. &&iterEndNode!=m_DCFixNodesMap.end()&& iterEndNode->second.nodeType==POWERNODE::NodeType::eDc_NodeKind_RectierToTouchNet)
  2036. {
  2037. iterStartNode->second.RectierToTouchNetNode.SetUpNextNode(-1,0,false);
  2038. iterEndNode->second.RectierToTouchNetNode.SetUpPreNode(-1,0,false);
  2039. }
  2040. }
  2041. }
  2042. }
  2043. //(4)将始端站的直流母线节点设为头节点,末端站的直流母线节点设为尾节点
  2044. //if (DownStartBreakerStatus==false || DownEndBreakerStatus==false) //若当前接触网的始端断路器和末端断路器有任一为无电状态,则作下列处理
  2045. //{
  2046. // LineNodeData TailNode; //并将始端站的直流母线设为尾节点
  2047. // TailNode.ID = iterStartStation->second.GetRectierToTouchNetNodeID();
  2048. // TailNode.Kind = Dc_NodeKind_DownTail;
  2049. // TailNode.TouchNetID = iterTouchNet->first;
  2050. // TailNode.excursion = 0;
  2051. // m_DownFixRunDataList.push_back(TailNode);
  2052. // LineNodeData HeadNode; //并将尾端站的直流母线设为头节点
  2053. // HeadNode.ID = iterEndStation->second.GetRectierToTouchNetNodeID();
  2054. // HeadNode.Kind = Dc_NodeKind_DownHead;
  2055. // HeadNode.TouchNetID = iterTouchNet->first;
  2056. // HeadNode.excursion = 0;
  2057. // m_DownFixRunDataList.push_back(HeadNode);
  2058. //}
  2059. }
  2060. }
  2061. return true;
  2062. //xyx新增 end
  2063. //xyx屏蔽 begin
  2064. //TOUCHNETMAP::iterator iter = TouchNetMap.begin();
  2065. //if (iter!=TouchNetMap.end())
  2066. //{
  2067. // //iter++;
  2068. // if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING)
  2069. // {
  2070. // return false;
  2071. // }
  2072. // if (iter->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet&&iter->second->GetStatus()==Electric_Eqpmt_Status_OFF)
  2073. // {//接触网的相关信息
  2074. // CElectricEqpmt_Line_TouchNet*TouchNet=iter->second;
  2075. // DCSTATIONMAP::iterator iter1 = m_PowerStationNodeMap.find(TouchNet->GetStartStation());//当前接触网连接的始端站
  2076. // if (iter1!=m_PowerStationNodeMap.end())
  2077. // {
  2078. // DCYSNODEMAP::iterator iterstart = m_DCNodesMap.find(iter1->second.GetRectierToTouchNetNodeID());//始端站的直流正极母线节点
  2079. // if (iterstart!=m_DCNodesMap.end())
  2080. // {
  2081. // if (iterstart->second.nodeType==POWERNODE::eDc_NodeKind_RectierToTouchNet)
  2082. // {
  2083. // if (iter->second->GetRunDirection()==TRAIN_DIR_UP)
  2084. // {
  2085. // iterstart->second.RectierToTouchNetNode.SetUpNextNode(-1,0); //将始端站上行直流母线的后一节点设为短路 xyx注释
  2086. // //SetUpNextNode(int id,double len),len=0得到的电阻就为0,因此就设置了第一个电站的下一个区段短路
  2087. // }
  2088. // else if (iter->second->GetRunDirection()==TRAIN_DIR_DOWN)
  2089. // {
  2090. // iterstart->second.RectierToTouchNetNode.SetDownNextNode(-1,0); //将始端站下行直流母线的后一节点设为短路 xyx注释
  2091. // }
  2092. // }
  2093. // }
  2094. // }
  2095. // DCSTATIONMAP::iterator iter2 = m_PowerStationNodeMap.find(TouchNet->GetEndStation());//当前接触网连接的末端站
  2096. // if (iter2!=m_PowerStationNodeMap.end())
  2097. // {
  2098. // DCYSNODEMAP::iterator iterend = m_DCNodesMap.find(iter2->second.GetRectierToTouchNetNodeID());//末端站的直流正极母线节点
  2099. // if (iterend!=m_DCNodesMap.end())
  2100. // {
  2101. // if (iterend->second.nodeType==POWERNODE::eDc_NodeKind_RectierToTouchNet)
  2102. // {
  2103. // if (iter->second->GetRunDirection()==TRAIN_DIR_UP)
  2104. // {
  2105. // iterend->second.RectierToTouchNetNode.SetUpPreNode(-1,0); //将末端站上行直流母线的前一节点设为短路 xyx注释
  2106. // }
  2107. // else if (iter->second->GetRunDirection()==TRAIN_DIR_DOWN)
  2108. // {
  2109. // iterend->second.RectierToTouchNetNode.SetDownPreNode(-1,0); //将末端站下行直流母线的前一节点设为短路 xyx注释
  2110. // }
  2111. // }
  2112. // }
  2113. // }
  2114. // }
  2115. //}
  2116. //return true;
  2117. //xyx屏蔽 end
  2118. }
  2119. void DCSysMG::CalculValue() //计算相关电力值
  2120. {
  2121. if(m_RunStatus== DISPATCH_RUN_STATUS_RUNNING|| m_RunStatus==DISPATCH_RUN_STATUS_RUNINT)//运行状态
  2122. {
  2123. HaveResult = false;
  2124. m_DCNodesMap.clear();
  2125. m_ShortCutAreaTrians.clear();
  2126. m_DCNodesMap=m_DCFixNodesMap;
  2127. AdjustFixNodeRect(m_DCNodesMap);//m_DCNodesMap电力相关节点
  2128. CreateTrainNode();//生成列车节点并对其进行初始化,主要为其增加上下行数据
  2129. CalculRectArray();//计算整流器数组 //节点电压法计算 xyx注释
  2130. }
  2131. }
  2132. bool DCSysMG::UpdataTrainData(DCSysTrain& Train) //更新列车数据
  2133. {//根据当前的列车信息更新列车数据
  2134. m_CritilSec.lock();
  2135. if (IsTrainInPowerStation(Train))//判断列车是否在受电
  2136. {
  2137. map<int,DCSysTrain>::iterator iter =TrainSInStationMap.find(Train.ID);
  2138. if (iter!=TrainSInStationMap.end())
  2139. {
  2140. TrainSInStationMap.erase(Train.ID); //先将列车的旧数据整体删除,再将列车的最新数据整体重新添加 xyx注释
  2141. }
  2142. TrainSInStationMap.insert(make_pair(Train.ID,Train)); //如果列车已在线上正常(受电弓有电)运行,则更新列车运行状态
  2143. m_CritilSec.unlock();
  2144. return true;
  2145. }
  2146. else
  2147. {
  2148. map<int,DCSysTrain>::iterator iter =TrainSInStationMap.find(Train.ID);
  2149. if (iter!=TrainSInStationMap.end())
  2150. {
  2151. TrainSInStationMap.erase(Train.ID); //如果列车在线上但未正常(受电弓)运行,则需把列车删除现有列车列表
  2152. }
  2153. m_CritilSec.unlock();
  2154. return false;
  2155. }
  2156. }
  2157. bool DCSysMG::IsTrainInPowerStation(DCSysTrain& Train) //判断列车是否在受电
  2158. {
  2159. if (OCC_TRAIN_POWERBOW_STATUS_ON==Train.powerbowstatus)//受电弓状态的判断
  2160. {
  2161. string touchnet = GetTouchNetByPosition(Train.LineSectionID,Train.excursion);
  2162. TOUCHNETMAP::iterator iter;
  2163. try
  2164. {
  2165. //string ST = GetTouchNetByPosition(Train.LineSectionID,Train.excursion);
  2166. if (TouchNetMap.size()>0 /*&&*/ /*(touchnet!=_T("") || touchnet !=0)*/)
  2167. {
  2168. int a = TouchNetMap.size();
  2169. if (a == 0)
  2170. {
  2171. return false;
  2172. }
  2173. iter = TouchNetMap.find(touchnet);
  2174. }
  2175. else
  2176. {
  2177. int a = 1;
  2178. return false;
  2179. }
  2180. }
  2181. catch (...)
  2182. {
  2183. return false;
  2184. }
  2185. //通过列车区域ID和列车偏移精度来获取列车在接触网的位置
  2186. if (iter!=TouchNetMap.end()/*&&iter->second->GetBaseType()==OCC_EQPMTTYPE_TouchNet*/)//类型判断-接触网线
  2187. {
  2188. Train.arrow = iter->second->GetRunDirection();//根据接触网线的状态来判断列车的运行方向,进而判断和指定车的方向
  2189. return true;
  2190. }
  2191. }
  2192. return false;
  2193. }
  2194. void DCSysMG::CheckSpanNetInfo()
  2195. {
  2196. DCSTATIONMAP::iterator iter = m_PowerStationNodeMap.begin();
  2197. for (;iter!=m_PowerStationNodeMap.end();iter++)
  2198. {
  2199. ELEEQPMTMAP:: iterator itEqpmtUp = ElectricEqpmtMap.find(iter->second.GetOverZoneUpSwitchID());
  2200. if (itEqpmtUp!=ElectricEqpmtMap.end())
  2201. {
  2202. if (itEqpmtUp->second->GetPower())
  2203. {
  2204. AddSpanNetInfo(iter->second.GetID(),-1,TRAIN_DIR_UP);
  2205. }
  2206. }
  2207. ELEEQPMTMAP:: iterator itEqpmtDown = ElectricEqpmtMap.find(iter->second.GetOverZoneDownSwitchID());
  2208. if (itEqpmtDown!=ElectricEqpmtMap.end())
  2209. {
  2210. if (itEqpmtDown->second->GetPower())
  2211. {
  2212. AddSpanNetInfo(iter->second.GetID(),-1,TRAIN_DIR_DOWN);
  2213. }
  2214. }
  2215. //xyx新增begin 根据直流进线开关状态确定是否添加越区节点信息
  2216. bool BreakerPower1=true;
  2217. bool BreakerPower2=true;
  2218. ELEEQPMTMAP:: iterator iterDCInputBreaker1 = ElectricEqpmtMap.find(iter->second.GetFirstDCInputBreakerUnitID());
  2219. if (iterDCInputBreaker1!=ElectricEqpmtMap.end())
  2220. {
  2221. ELEEQPMTMAP:: iterator iterDCInputBreaker2 = ElectricEqpmtMap.find(iter->second.GetSecondDCInputBreakerUnitID());
  2222. if (iterDCInputBreaker2!=ElectricEqpmtMap.end())
  2223. {
  2224. if ( (!iterDCInputBreaker1->second->GetPower())&& !(iterDCInputBreaker1->second->GetPower()) )
  2225. {
  2226. AddSpanNetInfo(iter->second.GetID(),-1,-1);
  2227. }
  2228. }
  2229. }
  2230. //xyx新增end
  2231. }
  2232. }
  2233. void DCSysMG::DeleteSpanNetInfo()
  2234. {
  2235. DCSTATIONMAP::iterator iter = m_PowerStationNodeMap.begin();
  2236. for (;iter!=m_PowerStationNodeMap.end();iter++)
  2237. {
  2238. ELEEQPMTMAP:: iterator itEqpmtUp = ElectricEqpmtMap.find(iter->second.GetOverZoneUpSwitchID());
  2239. if (itEqpmtUp!=ElectricEqpmtMap.end())
  2240. {
  2241. if (itEqpmtUp->second->GetPower())
  2242. {
  2243. RemoveSpanNetInfo(iter->second.GetID(),-1,TRAIN_DIR_UP);
  2244. }
  2245. }
  2246. ELEEQPMTMAP:: iterator itEqpmtDown = ElectricEqpmtMap.find(iter->second.GetOverZoneDownSwitchID());
  2247. if (itEqpmtDown!=ElectricEqpmtMap.end())
  2248. {
  2249. if (itEqpmtDown->second->GetPower())
  2250. {
  2251. RemoveSpanNetInfo(iter->second.GetID(),-1,TRAIN_DIR_DOWN);
  2252. }
  2253. }
  2254. }
  2255. }