ElectricityVOC.cpp 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928
  1. #include "pch.h"
  2. #include "ElectricityVOC.h"
  3. #include "YD_Public_OCC.h"
  4. #include <iostream>
  5. #include <vector>
  6. #include <string>
  7. #include <sstream>
  8. //#ifdef _OCC_MOVE_LINUX
  9. //#define CSELEC_DISPATCH_API __declspec(dllexport)
  10. //#else
  11. //#define CSELEC_DISPATCH_API __declspec(dllimport)
  12. //#endif
  13. #ifdef _WIN32
  14. // Windows平台
  15. #ifdef _OCC_MOVE_LINUX
  16. #define CSELEC_DISPATCH_API __declspec(dllexport)
  17. #else
  18. #define CSELEC_DISPATCH_API __declspec(dllimport)
  19. #endif
  20. #else
  21. // Linux和其他Unix-like平台
  22. #ifdef _OCC_MOVE_LINUX
  23. #define CSELEC_DISPATCH_API __attribute__((visibility("default")))
  24. #else
  25. #define CSELEC_DISPATCH_API
  26. #endif
  27. #endif
  28. time_t m_BeginTimeElectricity = -1;
  29. int m_timeturns = 3;
  30. /*******************************************************
  31. 函数名称: Create_Sub_Dispatch
  32. 函数功能: 创建子调度模块
  33. 输入参数: void
  34. 输出参数: nullptr
  35. 返回值 : CBaseDispatch* - 子调度模块指针
  36. *******************************************************/
  37. extern "C" CSELEC_DISPATCH_API CBaseDispatch * __stdcall Create_Sub_Dispatch()
  38. {
  39. printf("-------------ElectricityVOC-Create_Sub_Dispatch--------------------\r");
  40. CBaseDispatch* pPlugin = nullptr;
  41. pPlugin = new ElectricityVOC();
  42. return pPlugin;
  43. }
  44. /*******************************************************
  45. 函数名称: Free_Sub_Dispatch
  46. 函数功能: 释放子调度模块
  47. 输入参数: pPlugin - 子调度模块指针
  48. 输出参数: nullptr
  49. 返回值 : void
  50. *******************************************************/
  51. extern "C" CSELEC_DISPATCH_API void __stdcall Free_Sub_Dispatch(void* pPlugin)
  52. {
  53. ElectricityVOC* pInstance = (ElectricityVOC*)pPlugin;
  54. if (nullptr != pInstance)
  55. {
  56. delete pInstance;
  57. pInstance = nullptr;
  58. }
  59. }
  60. ELCEQPMTALARMINFOMAP ElectricityVOC::m_ElcEqpmtAlarmInfoMap;
  61. //计算结果更新线程 xyx新增begin
  62. int ObjectPowerValueUpdateAss(void* lpParameter)
  63. {
  64. if (lpParameter!=nullptr)
  65. {
  66. ElectricityVOC* lpthis=(ElectricityVOC*)lpParameter;
  67. lpthis->m_ObjectPowerThreadOut=false;
  68. try
  69. {
  70. while (!lpthis->m_ObjectPowerThreadOut)
  71. {
  72. //WaitForSingleObject(m_hExit,INFINITE);
  73. lpthis->UpdateEqpmtPowerValue(); //更新设备电气量并发布数据
  74. //ResetEvent(m_hExit); //更新一次完成后,复位触发事件为无信号状态,等待下次触发
  75. }
  76. string logstr("调度任务TreadObjectPowerValueUpdateAss线程退出");
  77. lpthis->AddLogItem(logstr,LOG_LEVEL_ERROR);
  78. }
  79. catch (std::exception& error)
  80. {
  81. std::ostringstream oss;
  82. oss << "TreadObjectCP Have a Error : " << error.what()
  83. << ", Trainid = " << lpthis->m_trianid
  84. << ", TrainType = " << lpthis->m_subsystype;
  85. std::string errorstr = oss.str();
  86. lpthis->AddLogItem(errorstr,LOG_LEVEL_ERROR);
  87. }
  88. }
  89. return 0;
  90. }
  91. //xyx新增end
  92. int GetStationType( int nStation )
  93. {
  94. int nRet = StationType_NULL;
  95. ELECSTATIONMAP::iterator iterStation =m_MI_powerstation.find(nStation);
  96. if ( iterStation != m_MI_powerstation.end() )
  97. {
  98. nRet = iterStation->second.stationType;
  99. }
  100. return nRet;
  101. }
  102. void GetMainSubStationID( int& nFirstStationID, int& nSecondStationID )
  103. {
  104. ELECSTATIONMAP::iterator iterStation =m_MI_powerstation.begin();
  105. for( ; iterStation != m_MI_powerstation.end(); iterStation++ )
  106. {
  107. if ( StationType_MainSubStation == iterStation->second.stationType )
  108. {
  109. if ( nFirstStationID < 0 )
  110. {
  111. nFirstStationID = iterStation->second.stationID;
  112. }
  113. else
  114. {
  115. nSecondStationID = iterStation->second.stationID;
  116. break;
  117. }
  118. }
  119. }
  120. }
  121. //电调运算服务,点明这个类的作用
  122. ElectricityVOC::ElectricityVOC(void)
  123. {
  124. m_subsystype=OCC_SYS_DD_SVR;
  125. //InitEqpmtID();
  126. /*PQValuesArray=new DCNodePQValue[All_Power_Station_Nums];
  127. m_AcSysMG=new ACSysMG();
  128. m_DcSysMG=new DCSysMG();*/
  129. //修改初始化位置
  130. PQValuesArray = nullptr;
  131. m_AcSysMG = nullptr;
  132. m_DcSysMG = nullptr;
  133. //m_pBaseElcEqpmt = new BaseElectricEqpmt;
  134. }
  135. ElectricityVOC::~ElectricityVOC(void)
  136. {
  137. if (PQValuesArray!=nullptr)
  138. {
  139. delete[] PQValuesArray;
  140. PQValuesArray= nullptr;
  141. }
  142. for (TrackRelationXDMAP::iterator iterd=m_TrackRelationXDMap.begin();iterd!=m_TrackRelationXDMap.end();iterd++)
  143. {
  144. if (iterd->second!= nullptr)
  145. {
  146. delete iterd->second;
  147. iterd->second=nullptr;
  148. }
  149. }
  150. ELEEQPMTMAP::iterator iter = ElectricEqpmtMap.begin();
  151. for (;iter!=ElectricEqpmtMap.end();iter++)
  152. {
  153. if (iter->second==nullptr)
  154. {
  155. continue;
  156. }
  157. delete iter->second;
  158. iter->second=nullptr;
  159. }
  160. ElectricEqpmtMap.clear();
  161. EQPMTTELEINFO::iterator iter_tele = m_mapEqpmtTelemetryInfo.begin();
  162. for (;iter_tele != m_mapEqpmtTelemetryInfo.end(); iter_tele++)
  163. {
  164. delete iter_tele->second;
  165. }
  166. m_mapEqpmtTelemetryInfo.clear();
  167. //DeleteCriticalSection(&EqpmtMapCriticalSection);
  168. }
  169. bool ElectricityVOC::GetInteractiveCmds(bool flag) //网络交互信息。。。。消息命令处理,接收网络包消息(主要为教员发所消息)
  170. {
  171. bool getData = false;
  172. OCCCOMMAND tmpItHC; //网路消息包,此结构体包括整个系统的相关定义
  173. if (!m_QI_GetCommands.empty()) //m_QI_GetCommands 接受命令及数据交互时使用该表
  174. {
  175. getData = m_QI_GetCommands.pop(tmpItHC);//网路消息队列
  176. }
  177. //getData = m_QI_GetCommands.pop(tmpItHC);//网路消息队列
  178. if (getData)
  179. {
  180. //////////////////////////////////////////////////////////////////////////
  181. if (tmpItHC.TrainningID ==m_trianid)//训练号
  182. {
  183. //保护复归信息
  184. if (tmpItHC.cmdType==OCCCOMMAND::eUpdateProtectRest)
  185. {
  186. NORMALCMDC cmd;
  187. cmd.cmdType = Power_Breaker_ProtectReset;
  188. cmd.paraInt7 = tmpItHC.ScrNetID;//added by zhangjiahua
  189. //strcpy(tmpItHC.Net_Elc_ProtectReset.Eqpmtid, cmd.StrPara1);
  190. //strcpy(tmpItHC.Net_Elc_ProtectReset.ProtecResetType);
  191. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_Elc_ProtectReset.Eqpmtid);
  192. snprintf(cmd.StrPara2, sizeof(cmd.StrPara2), tmpItHC.Net_Elc_ProtectReset.ProtecResetType);
  193. _QI_eventF1List.push(cmd);
  194. }
  195. //保护复归信息
  196. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateProtectAllRest)
  197. {
  198. NORMALCMDC cmd;
  199. cmd.cmdType = Power_Breaker_ProtectAllReset;
  200. //strcpy(tmpItHC.Net_Elc_ProtectAllReset.StationID, cmd.StrPara1, sizeof(cmd.StrPara1));
  201. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_Elc_ProtectAllReset.StationID);
  202. _QI_eventF1List.push(cmd);
  203. }
  204. //防灾系统联动
  205. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateDisasterPrevention)
  206. {
  207. OCCCOMMAND tmpSendHC;
  208. tmpSendHC.setPacketValue(&tmpItHC.Net_Elc_DisasterPreventionToDDsys, OCCCOMMAND::eUpdateMainInOutI);
  209. tmpSendHC.DesSysType = OCC_SYS_DD_CLIENT;
  210. tmpSendHC.TrainningID = m_trianid;//训练编号
  211. tmpSendHC.ScrSysType = OCC_SYS_DD_SVR;
  212. SendNetMsg(tmpSendHC);
  213. }
  214. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateFixedValueArea) //设备定值区切换
  215. {
  216. NORMALCMDC cmd;
  217. cmd.cmdType = Elect_Eqpmt_FixedValueArea; //设备未操作
  218. cmd.paraInt1 = tmpItHC.Net_Elc_FixedValueInfoUpdate.CtrlType;
  219. cmd.paraInt2 = tmpItHC.Net_Elc_FixedValueInfoUpdate.FixedArea; //设备控制类型
  220. //Str_To_CharBuf(tmpItHC.Net_Elc_FixedValueInfoUpdate.EqpmtStrID, cmd.StrPara1, sizeof(cmd.StrPara1));
  221. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_Elc_FixedValueInfoUpdate.EqpmtStrID);
  222. _QI_eventF2List.push(cmd);
  223. }
  224. //控制闭锁信息
  225. else if ( tmpItHC.cmdType==OCCCOMMAND::eUpdateShieldStatus )
  226. {
  227. NORMALCMDC cmd;
  228. cmd.cmdType = tmpItHC.Net_Elc_SetShield.ShieldStatus;
  229. cmd.paraInt7 = tmpItHC.ScrNetID;//added by zhangjiahua
  230. //Str_To_CharBuf(tmpItHC.Net_Elc_SetShield.Eqpmtid, cmd.StrPara1, sizeof(cmd.StrPara1));
  231. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_Elc_SetShield.Eqpmtid);
  232. _QI_eventF1List.push(cmd);
  233. }
  234. else if (tmpItHC.cmdType==OCCCOMMAND::eUpdateAutoBolt_CtrlMode)
  235. {
  236. NORMALCMDC cmd;
  237. //cmd.paraInt1 = tmpItHC.Net_Elc_PowerAutoBoltCtrlMode.AutoBoltCtrlMode;
  238. cmd.cmdType = tmpItHC.Net_Elc_PowerAutoBoltCtrlMode.AutoBoltCtrlMode;
  239. cmd.paraInt1 = m_trianid;
  240. cmd.paraInt7 = tmpItHC.ScrNetID;//added by zhangjiahua
  241. //Str_To_CharBuf(tmpItHC.Net_Elc_PowerAutoBoltCtrlMode.Eqpmtid,cmd.StrPara1,sizeof(cmd.StrPara1));
  242. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_Elc_PowerAutoBoltCtrlMode.Eqpmtid);
  243. _QI_eventF1List.push(cmd);
  244. }
  245. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateAccident) //更新故障信息
  246. {
  247. NORMALCMDC cmd;//线程函数的参数(任务标号)
  248. cmd.cmdType = tmpItHC.Net_ELC_Accident.EventType;//Net_ELC_Accident电调的各类故障
  249. cmd.paraInt2 = tmpItHC.Net_ELC_Accident.parm;
  250. //Str_To_CharBuf(tmpItHC.Net_ELC_Accident.EqpmtStrID, cmd.StrPara1, sizeof(cmd.StrPara1));
  251. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_ELC_Accident.EqpmtStrID);
  252. _QI_eventF1List.push(cmd); //F1线程处理
  253. // 转发故障命令到客户端
  254. tmpItHC.DesSysType = OCC_SYS_DD_CLIENT;
  255. cmd.paraInt7 = tmpItHC.ScrNetID;//added by zhangjiahua
  256. m_pQI_SendCmdsList->push(tmpItHC);
  257. }
  258. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateOper) //设备操作命令,,,,消息类型
  259. {
  260. printf("-------------ElectricityVOC-eUpdateOper--------------------\r");
  261. printf("-------------ElectricityVOC-eUpdateOper-EqpmtStrID:%s--------------------\r",tmpItHC.Net_DH_EqpmtOper.EqpmtStrID);
  262. NORMALCMDC cmd;
  263. cmd.cmdType = POWER_EQPMT_OPERNO; //设备未操作
  264. cmd.paraInt2 = tmpItHC.Net_DH_EqpmtOper.EqpmtStatus;
  265. cmd.paraInt4 = tmpItHC.Net_DH_EqpmtOper.CtrlType; //设备控制类型
  266. cmd.paraInt5 = tmpItHC.Net_DH_EqpmtOper.OpeMark;
  267. cmd.paraInt7 = tmpItHC.ScrNetID;//added by zhangjiahua
  268. //Str_To_CharBuf(tmpItHC.Net_DH_EqpmtOper.EqpmtStrID, cmd.StrPara1, sizeof(cmd.StrPara1));
  269. //Str_To_CharBuf(tmpItHC.Net_DH_EqpmtOper.StdName, cmd.StrPara2, sizeof(cmd.StrPara2));
  270. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_DH_EqpmtOper.EqpmtStrID);
  271. snprintf(cmd.StrPara2, sizeof(cmd.StrPara2), tmpItHC.Net_DH_EqpmtOper.StdName);
  272. _QI_eventF2List.push(cmd);
  273. }
  274. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateEqpmtTelemeteryValue) //设备设置电压、电流遥测量,,,,消息类型
  275. {
  276. NORMALCMDC cmd;
  277. cmd.cmdType = Power_EQPMT_TELEMETERYVALUE; //设备设置电压、电流遥测量
  278. cmd.fPara = tmpItHC.Net_DH_EqpmtTelemtryValue.fValue;
  279. cmd.paraInt3 = tmpItHC.Net_DH_EqpmtTelemtryValue.nType; //遥测量类型
  280. cmd.paraInt4 = tmpItHC.Net_DH_EqpmtTelemtryValue.IsReset; //是否复位
  281. //Str_To_CharBuf(tmpItHC.Net_DH_EqpmtTelemtryValue.EqpmtStrID, cmd.StrPara1, sizeof(cmd.StrPara1));
  282. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_DH_EqpmtTelemtryValue.EqpmtStrID);
  283. _QI_eventF2List.push(cmd);
  284. }
  285. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateStationCommunication) //设置车站通信状态,,,,消息类型
  286. {
  287. NORMALCMDC cmd;
  288. cmd.cmdType = POWER_STATIONCOMMUNICATION_SET; //设置车站通信状态
  289. cmd.paraInt1 = tmpItHC.Net_Elc_StationCommunicationStatus.nStationID; //车站
  290. cmd.paraInt2 = tmpItHC.Net_Elc_StationCommunicationStatus.IsReset; //是否复位
  291. _QI_eventF2List.push(cmd);
  292. }
  293. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateOperCheck) //设备控制校验,,,设备操作校验
  294. {
  295. printf("-------------ElectricityVOC-eUpdateOperCheck--------------------\r");
  296. printf("-------------ElectricityVOC-eUpdateOperCheck-EqpmtStrID:%s--------------------\r", tmpItHC.Net_DH_OperCheck.EqpmtStrID);
  297. NORMALCMDC cmd; //常规命令传送使用的结构 typedef struct tgNormalCMDC{}NORMALCMDC;
  298. cmd.cmdType = POWER_EQPMT_OPERCHECK;
  299. cmd.paraInt1 = tmpItHC.Net_DH_OperCheck.ViewID; //视图ID,用于区分高、中、低压,6个参数,分别为typedef struct tgDHOperCheck的成员变量的值
  300. cmd.paraInt2 = tmpItHC.Net_DH_OperCheck.EqpmtStatus;
  301. cmd.paraInt3 = tmpItHC.Net_DH_OperCheck.StdID; //学员ID
  302. cmd.paraInt4 = tmpItHC.Net_DH_OperCheck.CtrlArea; //控制区域
  303. cmd.paraInt5 = tmpItHC.Net_DH_OperCheck.Grade; //等级
  304. cmd.paraInt6 = tmpItHC.Net_DH_OperCheck.StationID; //车站ID
  305. cmd.paraDWORD1 = tmpItHC.Net_DH_OperCheck.SubSysID; //子系统ID
  306. cmd.paraInt7 = tmpItHC.Net_DH_OperCheck.nOperType; //added by zhangjiahua
  307. //Str_To_CharBuf(tmpItHC.Net_DH_OperCheck.EqpmtStrID, cmd.StrPara1, sizeof(cmd.StrPara1));
  308. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_DH_OperCheck.EqpmtStrID);
  309. _QI_eventF2List.push(cmd);
  310. }
  311. else if (tmpItHC.cmdType==OCCCOMMAND::eUpdateTrain) //车辆更新信息
  312. {
  313. DCSysTrain Ptmptrain; //列车信息(与列车相关)类
  314. Ptmptrain.LineSectionID = tmpItHC.Net_XD_SimulateTrain.NoceCircuitryID; //NoceCircuitryID;//列车当前所在轨道电路编号
  315. Ptmptrain.excursion = tmpItHC.Net_XD_SimulateTrain.NoceCircuitryExute; //_XD_行调//列车在当前轨道电路上的偏移
  316. Ptmptrain.arrow = tmpItHC.Net_XD_SimulateTrain.RunArrow; //运行方向
  317. Ptmptrain.PowerRate = tmpItHC.Net_XD_SimulateTrain.PowerRate; //功率(电调用)
  318. Ptmptrain.Speed = tmpItHC.Net_XD_SimulateTrain.NoceSpeed; //列车当前速度
  319. Ptmptrain.ID = tmpItHC.Net_XD_SimulateTrain.trainID; //列车ID
  320. Ptmptrain.acceleration = tmpItHC.Net_XD_SimulateTrain.A; //当前加速度
  321. Ptmptrain.status = tmpItHC.Net_XD_SimulateTrain.nTrainElectryState; //列车电力状态
  322. Ptmptrain.powerbowstatus = tmpItHC.Net_XD_SimulateTrain.Electricbow; //受电弓
  323. if (m_DcSysMG != nullptr && m_DcSysMG->UpdataTrainData(Ptmptrain)) //用Ptmptrain信息更新列车相关信息
  324. {
  325. CheckTrainAccident(Ptmptrain); //校验Ptmptrain是否故障
  326. }
  327. }
  328. else if( tmpItHC.cmdType == OCCCOMMAND::eMaincontrolInit )
  329. {
  330. NORMALCMDC cmd;
  331. cmd.cmdType = Elect_Eqpmt_Init;
  332. cmd.paraInt7 = tmpItHC.ScrNetID;//added by yangs
  333. _QI_eventF2List.push(cmd);
  334. }
  335. else if ( tmpItHC.cmdType==OCCCOMMAND::eUpdateTurnOffArea )
  336. {
  337. NORMALCMDC cmd;
  338. cmd.cmdType = Power_HD_Fault;
  339. cmd.paraInt1 = tmpItHC.Net_Elc_NetElcTurnOffArea.AreaID;
  340. _QI_eventF2List.push(cmd);
  341. }
  342. else if ( tmpItHC.cmdType==OCCCOMMAND::eUpdateStationThreeLoadCut )
  343. {
  344. NORMALCMDC cmd;
  345. cmd.cmdType = Power_400V_ThreeLoadCut;
  346. cmd.paraInt1 = tmpItHC.Net_Elc_StationThreeLoadCut.StationID;
  347. cmd.paraInt2 = tmpItHC.Net_Elc_StationThreeLoadCut.ThreeLoadUnitID;
  348. cmd.paraInt3 = tmpItHC.Net_Elc_StationThreeLoadCut.Mark;
  349. _QI_eventF2List.push(cmd);
  350. }
  351. //遥信封锁信息处理
  352. else if(tmpItHC.cmdType==OCCCOMMAND::eUpdateRemoteLock)
  353. {
  354. NORMALCMDC cmd;
  355. cmd.cmdType = tmpItHC.Net_Elc_RemoteLock.isRemoteLock;
  356. cmd.paraInt1 = tmpItHC.Net_Elc_RemoteLock.nLockStatus;
  357. cmd.paraInt2 = tmpItHC.Net_Elc_RemoteLock.nCtrlType;
  358. cmd.paraInt3 = tmpItHC.Net_Elc_RemoteLock.nLockType;
  359. cmd.paraInt7 = tmpItHC.ScrNetID;//added by zhangjiahua
  360. //Str_To_CharBuf(tmpItHC.Net_Elc_RemoteLock.Eqpmtid, cmd.StrPara1, sizeof(cmd.StrPara1));
  361. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_Elc_RemoteLock.Eqpmtid);
  362. _QI_eventF2List.push(cmd);
  363. }
  364. //控制权限转换信息处理
  365. else if (tmpItHC.cmdType==OCCCOMMAND::eUpdateControlPermission)
  366. {
  367. NORMALCMDC cmd;
  368. cmd.cmdType = ControlPermissionChange;
  369. cmd.paraInt1 = tmpItHC.Net_Elc_ControlPermission.nStationID;
  370. cmd.paraInt2 = tmpItHC.Net_Elc_ControlPermission.nControlArea;
  371. cmd.paraInt7 = tmpItHC.ScrNetID;//added by zhangjiahua
  372. _QI_eventF2List.push(cmd);
  373. }
  374. //更新模式信息
  375. else if (tmpItHC.cmdType==OCCCOMMAND::eUpdateModeInfo)
  376. {
  377. NORMALCMDC cmd;
  378. cmd.cmdType = Power_Mode_Control;
  379. cmd.paraInt1 = tmpItHC.Net_Elc_ModeControl.ModeID; //模式号
  380. cmd.paraInt2 = tmpItHC.Net_Elc_ModeControl.nModeStatus; //模式运行状态
  381. _QI_eventF2List.push(cmd);
  382. }
  383. //教员课程事件触发处理
  384. else if (tmpItHC.cmdType==OCCCOMMAND::eDispatchCourseEvent)
  385. {
  386. if (JY_CourseEventType_DD == tmpItHC.Net_JY_DispatchCourseEvent.nEventType) //课程事件类型-电调
  387. {
  388. if ( JY_CourseEventsubType1_DD_Normal == tmpItHC.Net_JY_DispatchCourseEvent.EventSubType1) //事件子类型1-基本事件
  389. {
  390. NORMALCMDC cmd;
  391. //mod by yangsong 20200311
  392. /*
  393. cmd.cmdType = Power_Mode_Control; //(1)模式控制
  394. string strModeID = "";
  395. strcpy(strModeID.GetBuffer(GUID_LEN),tmpItHC.Net_JY_DispatchCourseEvent.AssociPara1); //(2)关联参数1:模式编号(电调各类模式)
  396. cmd.paraInt1 = atoi(strModeID);
  397. strModeID.ReleaseBuffer(GUID_LEN);
  398. cmd.paraInt2 = MODECTRL_STATUS_RUNING; //(3)模式运行状态:默认为模式运行
  399. _QI_eventF2List.push(cmd); //F2线程处理
  400. */
  401. switch(tmpItHC.Net_JY_DispatchCourseEvent.EventSubType2)
  402. {
  403. case 1://分闸
  404. cmd.cmdType = POWER_EQPMT_OPERNO; //设备未操作
  405. cmd.paraInt2 = 0;
  406. cmd.paraInt4 = 2001; //设备控制类型
  407. cmd.paraInt5 = 1;
  408. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  409. //Str_To_CharBuf("OCC", cmd.StrPara2, sizeof(cmd.StrPara2));
  410. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  411. snprintf(cmd.StrPara2, sizeof(cmd.StrPara2), "OCC");
  412. _QI_eventF2List.push(cmd);
  413. break;
  414. case 2://合闸
  415. cmd.cmdType = POWER_EQPMT_OPERNO; //设备未操作
  416. cmd.paraInt2 = 1;
  417. cmd.paraInt4 = 2001; //设备控制类型
  418. cmd.paraInt5 = 1;
  419. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  420. //Str_To_CharBuf("OCC", cmd.StrPara2, sizeof(cmd.StrPara2));
  421. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  422. snprintf(cmd.StrPara2, sizeof(cmd.StrPara2), "OCC");
  423. _QI_eventF2List.push(cmd);
  424. break;
  425. case 3://遥信封锁 分
  426. cmd.cmdType = RemoteLock_Set;
  427. cmd.paraInt1 = 0;
  428. cmd.paraInt2 = 6604;
  429. cmd.paraInt3 = RemoteLockType_Off;
  430. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  431. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  432. _QI_eventF2List.push(cmd);
  433. break;
  434. case 4://遥信封锁 合
  435. cmd.cmdType = RemoteLock_Set;
  436. cmd.paraInt1 = 1;
  437. cmd.paraInt2 = 6604;
  438. cmd.paraInt3 = RemoteLockType_On;
  439. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  440. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  441. _QI_eventF2List.push(cmd);
  442. break;
  443. case 5://遥信封锁就地
  444. cmd.cmdType = RemoteLock_Set;
  445. cmd.paraInt1 = 1;
  446. cmd.paraInt2 = 6602;
  447. cmd.paraInt3 = RemoteLockType_Local;
  448. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  449. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  450. _QI_eventF2List.push(cmd);
  451. break;
  452. case 6://遥信解锁
  453. cmd.cmdType = RemoteLock_Cancle;
  454. cmd.paraInt1 = 1;
  455. cmd.paraInt2 = 6604;
  456. cmd.paraInt3 = RemoteLockType_No;
  457. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  458. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  459. _QI_eventF2List.push(cmd);
  460. break;
  461. case 7://控制闭锁
  462. cmd.cmdType = ShieldStatus_Set;
  463. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  464. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  465. _QI_eventF1List.push(cmd);
  466. break;
  467. case 8://闭锁解锁
  468. cmd.cmdType = ShieldStatus_Cancle;
  469. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  470. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  471. _QI_eventF1List.push(cmd);
  472. break;
  473. case 9://故障复归
  474. cmd.cmdType = Power_Breaker_ProtectReset;
  475. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  476. //Str_To_CharBuf("保护复归", cmd.StrPara2, sizeof(cmd.StrPara2));
  477. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  478. snprintf(cmd.StrPara2, sizeof(cmd.StrPara2), "保护复归");
  479. _QI_eventF1List.push(cmd);
  480. break;
  481. case 10://手车试验
  482. cmd.cmdType = RemoteLock_Set;
  483. cmd.paraInt1 = 3;
  484. cmd.paraInt2 = 6603;
  485. cmd.paraInt3 = RemoteLockType_Test;
  486. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  487. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  488. _QI_eventF2List.push(cmd);
  489. break;
  490. case 11://手车工作
  491. cmd.cmdType = RemoteLock_Set;
  492. cmd.paraInt1 = 2;
  493. cmd.paraInt2 = 6603;
  494. cmd.paraInt3 = RemoteLockType_Work;
  495. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1));
  496. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  497. _QI_eventF2List.push(cmd);
  498. break;
  499. default:
  500. break;
  501. }
  502. //mod end
  503. }
  504. else if ( JY_CourseEventsubType1_DD_Fault == tmpItHC.Net_JY_DispatchCourseEvent.EventSubType1) //事件子类型2-故障事件
  505. {
  506. NORMALCMDC cmd;
  507. cmd.cmdType = POWER_ERORR_OCCAR; //(1)默认为故障触发
  508. //Str_To_CharBuf(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2, cmd.StrPara1, sizeof(cmd.StrPara1)); //(2)关联参数2:故障设备编号
  509. //string strFaultID = "";
  510. //strcpy(strFaultID.GetBuffer(GUID_LEN),tmpItHC.Net_JY_DispatchCourseEvent.AssociPara1); //(3)关联参数1:故障类型编号(电调各类故障)
  511. //cmd.paraInt2 = atoi(strFaultID);
  512. //strFaultID.ReleaseBuffer(GUID_LEN);
  513. //
  514. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), tmpItHC.Net_JY_DispatchCourseEvent.AssociPara2);
  515. cmd.paraInt2 = atoi(tmpItHC.Net_JY_DispatchCourseEvent.AssociPara1);
  516. _QI_eventF1List.push(cmd); //F1线程处理
  517. tmpItHC.DesSysType = OCC_SYS_DD_CLIENT; // 转发故障命令到客户端
  518. m_pQI_SendCmdsList->push(tmpItHC);
  519. }
  520. }
  521. }
  522. else if (tmpItHC.cmdType==OCCCOMMAND::eUpdateEqpmtInitStatus)//设备状态初始化
  523. {
  524. m_ElectricEvent.EqpmetInit();
  525. if (!m_ElectricEvent.CloseOffSwicth()) //是否关闭开关,,初始化断路器合闸
  526. {
  527. return false;
  528. }
  529. tmpItHC.DesSysType = OCC_SYS_DD_CLIENT; // 转发初始化命令到客户端
  530. m_pQI_SendCmdsList->push(tmpItHC);
  531. }
  532. else if (tmpItHC.cmdType == OCCCOMMAND::eUpdateDHMsgNotice)//真实设备报警
  533. {
  534. tmpItHC.DesSysType = OCC_SYS_DD_CLIENT; // 转发初始化命令到客户端
  535. tmpItHC.ScrSysType = OCC_SYS_DD_SVR;
  536. m_pQI_SendCmdsList->push(tmpItHC);
  537. }
  538. else if (tmpItHC.cmdType==OCCCOMMAND::CMD_INPUT_FROM_IO)//设备状态初始化
  539. {
  540. string str1 = tmpItHC.Net_IBP_SERVER.EqpmtStrID; // 设备编号
  541. string str2 = tmpItHC.Net_IBP_SERVER.strParam1; // 字符串参1
  542. string str3 = tmpItHC.Net_IBP_SERVER.strParam2; // 字符串参2
  543. string str4 = tmpItHC.Net_IBP_SERVER.strParam3; // 字符串参3
  544. string str5 = tmpItHC.Net_IBP_SERVER.strParam4; // 字符串参4
  545. DealWith_IBPEvent(tmpItHC.ScrNetID,tmpItHC.Net_IBP_SERVER.nCmdValue,tmpItHC.Net_IBP_SERVER.param1,tmpItHC.Net_IBP_SERVER.param2,tmpItHC.Net_IBP_SERVER.param3,tmpItHC.Net_IBP_SERVER.param4,tmpItHC.Net_IBP_SERVER.nStatus
  546. ,str1,str2,str3,str4,str5,tmpItHC.Net_IBP_SERVER.nIBPStationID);
  547. }
  548. else if ( tmpItHC.cmdType == OCCCOMMAND::eUpdateMSFVO ) //行-电客户端数据转发
  549. {
  550. OCCCOMMAND TmpNetCmd = tmpItHC;
  551. TmpNetCmd.DesSysType = OCC_SYS_DD_CLIENT;
  552. TmpNetCmd.ScrSysType = OCC_SYS_DD_SVR;
  553. m_pQI_SendCmdsList->push(TmpNetCmd);
  554. TmpNetCmd.DesSysType = OCC_SYS_XD_CLIENT;
  555. m_pQI_SendCmdsList->push(TmpNetCmd);
  556. }
  557. bool bSend = Send_DispatchSys_OperR(tmpItHC,1);
  558. }
  559. }
  560. if (m_ElectricEvent.NeedDelayTimeDeal()) //判断是否需要延时处理
  561. {
  562. NORMALCMDC cmd;
  563. cmd.cmdType = Power_Deal_DelayTime;
  564. _QI_eventF2List.push(cmd); //延时处理由F2线程
  565. }
  566. return getData;
  567. }
  568. void ElectricityVOC::CheckTrainAccident(DCSysTrain& train) //列车事故检查
  569. {
  570. if (train.status==OCC_TRAIN_SHROTCUT_STATUS && m_DcSysMG != nullptr) //train是否处于短路状态
  571. {
  572. NORMALCMDC cmd; //常规命令数据结构
  573. cmd.cmdType = POWER_ERORR_OCCAR; //事故发生(电力错误)
  574. string Str_Temp = "";
  575. Str_Temp = m_DcSysMG->GetTouchNetByPosition(train.LineSectionID,train.excursion); //根据线区ID号和列车偏移量获取接触网的位置
  576. cmd.paraInt2 = 5000; //cmd.paraInt2 = tmpItHC.Net_DH_OperCheck.EqpmtStatus;接触网金属性短路
  577. //Str_To_CharBuf(Str_Temp, cmd.StrPara1, sizeof(cmd.StrPara1));
  578. snprintf(cmd.StrPara1, sizeof(cmd.StrPara1), Str_Temp.c_str());
  579. _QI_eventF1List.push(cmd);
  580. }
  581. }
  582. void ElectricityVOC::UpdateACPowerLineStatus_Init()
  583. {
  584. if (m_AcSysMG == nullptr)
  585. {
  586. return;
  587. }
  588. map<int,EqpmtInfo*>::iterator iterEqpmt=m_AcSysMG->m_EqpmtInfoMap.begin();
  589. for (;iterEqpmt!=m_AcSysMG->m_EqpmtInfoMap.end();iterEqpmt++)
  590. {
  591. PowerLine* pline=(PowerLine*)iterEqpmt->second;
  592. int status=1;
  593. for (int i=0;i<pline->m_vecSwitchStrID.size();i++)
  594. {
  595. ELEEQPMTMAP::iterator iterElc = ElectricEqpmtMap.find(pline->m_vecSwitchStrID[i]);
  596. if (iterElc!=ElectricEqpmtMap.end())
  597. {
  598. if (!iterElc->second->GetPower())
  599. {
  600. status=0;
  601. break;
  602. }
  603. }
  604. }
  605. pline->SetStatus(status);
  606. }
  607. }
  608. void ElectricityVOC::UpdateNodeStatus_Init()
  609. {
  610. if (m_AcSysMG == nullptr)
  611. {
  612. return;
  613. }
  614. for (int i=0;i<m_AcSysMG->m_PQNodes.size();i++)
  615. {
  616. ELEEQPMTMAP::iterator iterElc = ElectricEqpmtMap.find(m_AcSysMG->m_PQNodes[i].BgkID);
  617. if (iterElc!=ElectricEqpmtMap.end())
  618. {
  619. if (!iterElc->second->GetPower())
  620. {
  621. m_AcSysMG->m_PQNodes[i].Status=0;
  622. m_AcSysMG->m_PQNodes[i].E=0;
  623. m_AcSysMG->m_PQNodes[i].F=0;
  624. }
  625. else
  626. {
  627. m_AcSysMG->m_PQNodes[i].Status=1;
  628. m_AcSysMG->m_PQNodes[i].E=m_AcSysMG->m_PQNodes[i].m_IniE;
  629. m_AcSysMG->m_PQNodes[i].F=m_AcSysMG->m_PQNodes[i].m_IniF;
  630. }
  631. }
  632. }
  633. }
  634. BOOL ElectricityVOC::InitInstance() //初始化实例
  635. {
  636. printf("-------------ElectricityVOC-InitInstance-begin--------------------");
  637. m_ElectricEvent.SetEqpmtMap(&ElectricEqpmtMap, &EqpmtMapCriticalSection, &m_mapEqpmtTelemetryInfo); //电力事件处理
  638. m_ElectricEvent.SetInitInfo(m_pQI_SendCmdsList,m_trianid); //设置初始化信息
  639. //InitializeCriticalSection(&EqpmtMapCriticalSection);
  640. if (m_curseinfo.m_nTaskType==CourseType_Examination)
  641. {
  642. m_ElectricEvent.IsExamMOde=true;
  643. }
  644. else
  645. {
  646. m_ElectricEvent.IsExamMOde = false;
  647. }
  648. if (!InitPowerStationData()) //初始化车站数据
  649. {
  650. return FALSE;
  651. }
  652. if (!m_ElectricEvent.CloseOffSwicth()) //是否关闭开关,,初始化断路器合闸
  653. {
  654. return FALSE;
  655. }
  656. //m_ElectricEvent.SystemInit();
  657. //m_ElectricEvent.EqpmetInit();//added by zhangjiahua 修改设备初始化方式
  658. m_ElectricEvent.SendControlPermission();
  659. SendIniCmd();
  660. //m_hExit= CreateEvent( FALSE, TRUE, nullptr, nullptr );
  661. // 使用lambda
  662. std::thread tUpdateAss([this]() {
  663. ObjectPowerValueUpdateAss(this);
  664. });
  665. // 记得join或detach // join会导致主线线程等待 detach让子线程独自运行
  666. tUpdateAss.detach();
  667. printf("-------------ElectricityVOC-InitInstance-end--------------------");
  668. return TRUE;
  669. }
  670. int ElectricityVOC::ExitInstance()//释放资源,
  671. {
  672. //m_RunStatus=DISPATCH_RUN_STATUS_STOP;//运行状态停止
  673. EqpmtMapCriticalSection.lock();
  674. if (m_AcSysMG != nullptr)
  675. {
  676. delete m_AcSysMG;
  677. }
  678. if (m_DcSysMG != nullptr)
  679. {
  680. delete m_DcSysMG;
  681. }
  682. //added by zhangjiahua
  683. m_MultiModeMap.clear();
  684. m_ModeDataMap.clear();
  685. m_ModeIDDataMap.clear();
  686. m_mapPowerValueUpdateEqpmt.clear();
  687. m_ObjectPowerThreadOut=true;
  688. m_MI_powerstation.clear();
  689. EqpmtMapCriticalSection.unlock();
  690. return 0;
  691. }
  692. bool ElectricityVOC::AddStationToPointList()//初始化车站节点
  693. {
  694. ELECSTATIONMAP::iterator iter =m_MI_powerstation.begin();
  695. for (int i=0;iter!=m_MI_powerstation.end();++iter,i++)
  696. {
  697. //PQValuesArray[i].P_HK = 1230000;//副站有功功率
  698. //PQValuesArray[i].Q_HK = 400000;
  699. PQValuesArray[i].P_HK = 1000000;//有功功率
  700. PQValuesArray[i].Q_HK = 750000;
  701. PQValuesArray[i].StationID=iter->second.stationID;
  702. }
  703. return true; //需要默认函数继续处理
  704. }
  705. bool ElectricityVOC::InitPowerStationData()//初始化车站数据
  706. {
  707. //if (!m_DcSysMG->CreateFixYNodes())
  708. // return false;
  709. if (!AddStationToPointList())
  710. return false;
  711. //if (!m_AcSysMG->CreatePQNodeMatrix())
  712. // return false;
  713. if (m_DcSysMG != nullptr)
  714. {
  715. m_DcSysMG->SetPQValueArr(PQValuesArray);//直流子系统,设置PQ节点数组
  716. }
  717. if (m_AcSysMG != nullptr)
  718. {
  719. m_AcSysMG->SetPQValueArr(PQValuesArray); //交流子系统
  720. }
  721. return true;
  722. }
  723. //////////////////////////////////////////////////////////////////////////
  724. bool ElectricityVOC::EventF1Ass(NORMALCMDC&NCmd)//线程函数,事件处理(svrn) NORMALCMDC为常规命令集
  725. {
  726. if ( m_RunStatus != DISPATCH_RUN_STATUS_RUNNING )
  727. {
  728. return false;
  729. }
  730. m_bF1ThreadFinish = false;
  731. //根据设备ID的故障类型和对应的参数对故障进行处理
  732. m_ElectricEvent.SetProtectSetStr(NCmd.StrPara1);//获得保护复归断路器设备ID
  733. m_ElectricEvent.DealWithAutoBoltCtrlMothod(NCmd.paraInt1,NCmd.StrPara1,NCmd.cmdType); //更新备自投控制模式
  734. m_ElectricEvent.DealEvent(NCmd,NCmd.cmdType,NCmd.StrPara1,NCmd.paraInt2,NCmd.StrPara2);//处理故障(电力事件处理)
  735. m_bF1ThreadFinish = true;
  736. return true;
  737. }
  738. //////////////////////////////////////////////////////////////////////////
  739. // 普通事件处理辅助函数
  740. // 返回true表示需要默认函数继续处理
  741. bool ElectricityVOC::EventF2Ass(NORMALCMDC&NCmd) //设备控制线程函数,NORMALCMDC为常规命令传送使用的结构
  742. {
  743. if ( m_RunStatus != DISPATCH_RUN_STATUS_RUNNING )
  744. {
  745. return false;
  746. }
  747. m_bF2ThreadFinish = false;
  748. if ( POWER_EQPMT_OPERNO == NCmd.cmdType ) //设备未操作(初始状态)
  749. {
  750. printf("-------------ElectricityVOC-EventF2Ass-EqpmtCtrl--------------------\r");
  751. printf("-------------ElectricityVOC-EventF2Ass-EqpmtCtrl-Timer: %d--------------------\r", GetSys_SecondTime_2());
  752. m_ElectricEvent.EqpmtCtrl(NCmd,NCmd.StrPara1,NCmd.paraInt2,NCmd.StrPara2,NCmd.paraInt4,NCmd.paraInt5);//设备控制函数
  753. }
  754. else if (POWER_EQPMT_OPERCHECK == NCmd.cmdType ) //设备操作检查
  755. {
  756. printf("-------------ElectricityVOC-EventF2Ass-EqpmtCtrlCheck--------------------\r");
  757. printf("-------------ElectricityVOC-EventF2Ass-EqpmtCtrlCheck-Timer: %d--------------------\r", GetSys_SecondTime_2());
  758. m_ElectricEvent.EqpmtCtrlCheck(NCmd.paraInt1,NCmd.paraDWORD1,NCmd.StrPara1,NCmd.paraInt2,NCmd.paraInt3,NCmd.paraInt4,NCmd.paraInt5,NCmd.paraInt6, NCmd.paraInt7);
  759. m_ElectricEvent.SetStaionID(NCmd.paraInt6);
  760. m_ElectricEvent.SetViewID(NCmd.paraInt1);
  761. m_ElectricEvent.SetSubSystemID(NCmd.paraDWORD1);
  762. m_ElectricEvent.SetStdID(NCmd.paraInt3);
  763. }
  764. else if (Power_Deal_DelayTime ==NCmd.cmdType) //电力延时处理
  765. {
  766. m_ElectricEvent.handle_delaytime();
  767. }
  768. else if ( Elect_Eqpmt_Init == NCmd.cmdType )
  769. {
  770. m_ElectricEvent.SystemInit(NCmd.paraInt7);
  771. //m_ElectricEvent.SendControlPermission();
  772. SendIniCmd();//初始化完成后通知客户端
  773. }
  774. else if ( Power_HD_Fault == NCmd.cmdType )
  775. {
  776. m_ElectricEvent.PowerCutArea( NCmd.paraInt1 );
  777. }
  778. else if ( Power_400V_ThreeLoadCut == NCmd.cmdType )
  779. {
  780. m_ElectricEvent.Deal400VLoad( NCmd.paraInt1,NCmd.paraInt2,NCmd.paraInt3 );
  781. }
  782. else if (RemoteLock_Set == NCmd.cmdType||RemoteLock_Cancle==NCmd.cmdType)
  783. {
  784. m_ElectricEvent.DealRemoteLock(NCmd);
  785. }
  786. else if (ControlPermissionChange==NCmd.cmdType)
  787. {
  788. //ELECSTATIONMAP::iterator iter= m_MI_powerstation.find(NCmd.paraInt1);
  789. //if (iter!=m_MI_powerstation.end())
  790. //{
  791. // iter->second.ctrlarea=NCmd.paraInt2;
  792. //}
  793. //SendControlPermission();
  794. m_ElectricEvent.DealPermissionChange(NCmd);
  795. }
  796. else if (Power_Mode_Control==NCmd.cmdType)
  797. {
  798. ModeControlDeal(NCmd.paraInt1,NCmd.paraInt2);
  799. }
  800. else if(Power_EQPMT_TELEMETERYVALUE == NCmd.cmdType)
  801. {
  802. m_ElectricEvent.SetEqpmtTelemeteryValue(NCmd.StrPara1, NCmd.paraInt3, NCmd.fPara, NCmd.paraInt4);
  803. }
  804. else if(POWER_STATIONCOMMUNICATION_SET == NCmd.cmdType)
  805. {
  806. m_ElectricEvent.DealWith_StationCommunicationStatus( NCmd.paraInt1, NCmd.paraInt2);
  807. }
  808. else if (Elect_Eqpmt_FixedValueArea == NCmd.cmdType)
  809. {
  810. m_ElectricEvent.DealWith_EqpmtFixedAreaCtrl(NCmd.StrPara1, NCmd.paraInt1, NCmd.paraInt2, NCmd.paraInt7);
  811. }
  812. m_bF2ThreadFinish = true;
  813. return true;
  814. }
  815. //////////////////////////////////////////////////////////////////////////
  816. // 事件发起辅助函数
  817. // 返回true表示需要重设时间
  818. bool ElectricityVOC::EventBeginAss(const time_t &time, const time_t &lpTimeSpan)//事件发起辅助函数
  819. {
  820. if ( m_RunStatus != DISPATCH_RUN_STATUS_RUNNING
  821. && m_RunStatus != DISPATCH_RUN_STATUS_RUNINT )
  822. {
  823. return false;
  824. }
  825. m_bBeginThreadFinish = false;
  826. bool bFlag = GetInteractiveCmds(true);
  827. m_bBeginThreadFinish = true;
  828. return bFlag;
  829. }
  830. void ElectricityVOC::SendNetMsg(OCCCOMMAND& msg)//发送网络消息
  831. {
  832. if (msg.DesSysType==OCC_SYS_DD_GROUP)
  833. {
  834. m_pQI_SendGroupList->push(msg);
  835. }
  836. else
  837. {
  838. m_pQI_SendCmdsList->push(msg);
  839. }
  840. //Sleep(TIMESPAN_LVS);
  841. std::this_thread::sleep_for(std::chrono::milliseconds(TIMESPAN_LVS));
  842. }
  843. bool ElectricityVOC::PublishData()//电力数据发布
  844. {
  845. if (m_DcSysMG != nullptr)
  846. {
  847. m_DcSysMG->SetElcEqpmtMap(ElectricEqpmtMap);
  848. }
  849. ELEEQPMTMAP::iterator iterEqpmtMap;
  850. TrackRelationXDMAP::iterator iterTrackMap = m_TrackRelationXDMap.begin();
  851. for (; iterTrackMap != m_TrackRelationXDMap.end(); iterTrackMap++)
  852. {
  853. iterEqpmtMap = ElectricEqpmtMap.find(iterTrackMap->second->m_strID);
  854. if (iterEqpmtMap != ElectricEqpmtMap.end())
  855. {
  856. //if (iterEqpmtMap->second->m_TrackRelationXD.m_PreIsPower != iterEqpmtMap->second->m_TrackRelationXD.m_IsPower)
  857. {
  858. //itetrackXD->second->m_IsPower = trackpower;
  859. COMMANDTOXD cmdtoxd;
  860. cmdtoxd.type = DDTOXD_ELCTRACK_STATUS;
  861. cmdtoxd.ObjectID = iterTrackMap->second->GetNoID();
  862. cmdtoxd.data1 = iterEqpmtMap->second->GetStatus();
  863. cmdtoxd.data2 = iterTrackMap->second->GetDirection();
  864. OCCCOMMAND tmpSendOC;
  865. tmpSendOC.cmdType = OCCCOMMAND::CmdType::eCommantoXD;
  866. //tmpSendOC.DesSysType = OCC_SYS_XD_CLIENT;
  867. tmpSendOC.DesSysType = OCC_SYS_XD_SVR;
  868. tmpSendOC.ScrSysType = OCC_SYS_DD_SVR;
  869. tmpSendOC.TrainningID = m_trianid;
  870. tmpSendOC.DateLen = sizeof(COMMANDTOXD);
  871. tmpSendOC.Net_LS_CommandtoXD = cmdtoxd;
  872. m_pQI_SendCmdsList->push(tmpSendOC);
  873. }
  874. //iterEqpmtMap->second->m_TrackRelationXD.m_PreIsPower = iterEqpmtMap->second->m_TrackRelationXD.m_IsPower;
  875. }
  876. }
  877. std::vector<POWERVALUE> PQIUpdataList; //第i个PQ节点数据,,有功无功功率数据节点
  878. if (m_AcSysMG != nullptr)
  879. {
  880. m_AcSysMG->GetPQIPublishLine(PQIUpdataList); //交流侧,有功、无功和电流数据发布信息列表,第i个节点的有功与无功功率(交流信息)
  881. }
  882. for(size_t n=0;n<PQIUpdataList.size();n++)
  883. {
  884. TRANSFORMSTATION updatadata;//typedef struct tgTransformSubStation: public tgBaseNetPacket{}TRANSFORMSTATION;
  885. updatadata.I =PQIUpdataList[n].InputI;//变压器输入电流
  886. updatadata.P =PQIUpdataList[n].P;//变压器有功功率
  887. updatadata.Q =PQIUpdataList[n].Q;//变压器无功功率
  888. std::strncpy(updatadata.strBreakerID, PQIUpdataList[n].EqpmtID.c_str(), sizeof(updatadata.strBreakerID));
  889. std::strncpy(updatadata.strTransformID, PQIUpdataList[n].SubLineID.c_str(), sizeof(updatadata.strTransformID));
  890. updatadata.Linetype=PQIUpdataList[n].Parm;
  891. updatadata.StationID = PQIUpdataList[n].StationID;
  892. OCCCOMMAND tmpSendHC;
  893. tmpSendHC.setPacketValue(&updatadata,OCCCOMMAND::eUpdatePQI); //将数据信息进行打包
  894. tmpSendHC.DesSysType=OCC_SYS_DD_GROUP; //电调组
  895. tmpSendHC.ScrSysType=OCC_SYS_DD_SVR; //电调服务端
  896. tmpSendHC.TrainningID = m_trianid; //训练编号
  897. SendNetMsg(tmpSendHC); //发送网络消息
  898. // mod GCH
  899. //if (MRunLineID == 200||MRunLineID == 500)
  900. //{
  901. // if (updatadata.strTransformID=="TR1")
  902. // {
  903. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,"201",POWERVALUE_DATATYPE_I,updatadata.I);
  904. // }
  905. // if (updatadata.strTransformID=="TR2")
  906. // {
  907. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,"202",POWERVALUE_DATATYPE_I,updatadata.I);
  908. // }
  909. //}
  910. //else if(MRunLineID == 300)
  911. //{
  912. // if (updatadata.strTransformID=="TT1") //变压器 左侧
  913. // {
  914. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,"201",POWERVALUE_DATATYPE_I,updatadata.I);
  915. // }
  916. // if (updatadata.strTransformID=="TT2")//右侧
  917. // {
  918. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,"202",POWERVALUE_DATATYPE_I,updatadata.I);
  919. // }
  920. //}
  921. //else if (MRunLineID == 400||MRunLineID == 600||MRunLineID == 700)
  922. //{
  923. // if (updatadata.strTransformID=="RT1")
  924. // {
  925. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,"201",POWERVALUE_DATATYPE_I,updatadata.I);
  926. // }
  927. // if (updatadata.strTransformID=="RT2")
  928. // {
  929. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,"202",POWERVALUE_DATATYPE_I,updatadata.I);
  930. // }
  931. //}
  932. //m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,PQIUpdataList[n].EqpmtID,POWERVALUE_DATATYPE_V,updatadata.V);
  933. }
  934. PQIUpdataList.clear();
  935. if (m_AcSysMG != nullptr)
  936. {
  937. m_AcSysMG->GetIPublishLine(PQIUpdataList); //交流侧:获取电流数据发布信息
  938. }
  939. for(size_t e=0;e<PQIUpdataList.size();e++)
  940. {
  941. STATIONMAINI updatadata;//typedef struct tgStationMainI: public tgBaseNetPacket{}STATIONMAINI;
  942. updatadata.InputI= PQIUpdataList[e].InputI;
  943. updatadata.OutputI = PQIUpdataList[e].OutputI;
  944. strncpy(updatadata.strInputLineID, PQIUpdataList[e].InputLineID.c_str(), sizeof(updatadata.strInputLineID));
  945. strncpy(updatadata.strOutLineID, PQIUpdataList[e].OutLineID.c_str(), sizeof(updatadata.strOutLineID));
  946. updatadata.StationID = PQIUpdataList[e].StationID;
  947. updatadata.Type = PQIUpdataList[e].Parm;
  948. updatadata.Position = PQIUpdataList[e].Position;
  949. OCCCOMMAND tmpSendHC;
  950. tmpSendHC.setPacketValue(&updatadata,OCCCOMMAND::eUpdateMainInOutI);
  951. tmpSendHC.DesSysType=OCC_SYS_DD_GROUP;
  952. tmpSendHC.TrainningID = m_trianid;//训练编号
  953. tmpSendHC.ScrSysType=OCC_SYS_DD_SVR;
  954. SendNetMsg(tmpSendHC);
  955. string breakname;
  956. // mod GCH
  957. //if (MRunLineID == 200||MRunLineID == 500)
  958. //{
  959. // if (updatadata.Position==1)
  960. // {
  961. // breakname = "101";
  962. // }
  963. // else if (updatadata.Position==2)
  964. // {
  965. // breakname = "102";
  966. // }
  967. // if (breakname!="")
  968. // {
  969. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,breakname,POWERVALUE_DATATYPE_I,updatadata.InputI);
  970. // }
  971. //}
  972. //else if(MRunLineID == 300||MRunLineID == 400||MRunLineID == 600)
  973. //{
  974. // if (updatadata.Position==1)//在备自投的左边位置(位置的判断)
  975. // {
  976. // breakname = "301"; //断路器
  977. // }
  978. // else if (updatadata.Position==2) //右边
  979. // {
  980. // breakname = "302";
  981. // }
  982. // if (breakname!="")
  983. // {
  984. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,breakname,POWERVALUE_DATATYPE_I,updatadata.InputI);//InputI输入母线电流
  985. // }
  986. //}
  987. // m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,PQIUpdataList[e].OutLineID,Power_OutLine_I,updatadata.OutputI);
  988. // Sleep(TIMESPAN_LVS);
  989. }
  990. PQIUpdataList.clear();
  991. if (m_AcSysMG != nullptr)
  992. {
  993. m_AcSysMG->GetMLVPublish(PQIUpdataList); //交流侧:获取母线电压发布数据
  994. }
  995. for(size_t k=0;k<PQIUpdataList.size();k++)
  996. {
  997. STATIONMLINEV updatadata;
  998. updatadata.V= PQIUpdataList[k].V;
  999. strncpy(updatadata.strMLineID, PQIUpdataList[k].MLineID.c_str(), sizeof(updatadata.strMLineID));
  1000. string mlline =PQIUpdataList[k].MLineID;
  1001. updatadata.StationID = PQIUpdataList[k].StationID;
  1002. updatadata.Position = PQIUpdataList[k].Position;
  1003. OCCCOMMAND tmpSendHC;
  1004. tmpSendHC.setPacketValue(&updatadata,OCCCOMMAND::eUpdateMotherLineV);
  1005. tmpSendHC.DesSysType=OCC_SYS_DD_GROUP;//目的系统,组播
  1006. tmpSendHC.TrainningID = m_trianid;//训练编号
  1007. tmpSendHC.ScrSysType=OCC_SYS_DD_SVR;//电调服务端
  1008. // mod GCH
  1009. /*string breakname;//设备名字,发生故障的名字
  1010. if (MRunLineID == 200||MRunLineID==500)
  1011. {
  1012. if (updatadata.Position==1)
  1013. {
  1014. breakname = "101";
  1015. }
  1016. else if (updatadata.Position==2)
  1017. {
  1018. breakname = "102";
  1019. }
  1020. }
  1021. else if(MRunLineID == 300||MRunLineID == 400||MRunLineID == 600)
  1022. {
  1023. if (updatadata.Position==1)
  1024. {
  1025. breakname = "301";
  1026. }
  1027. else if (updatadata.Position==2)
  1028. {
  1029. breakname = "302";
  1030. }
  1031. if (breakname!="")
  1032. {
  1033. m_DataBaseManger.SavePowerValue(m_trianid,updatadata.StationID,breakname,POWERVALUE_DATATYPE_V,updatadata.V);
  1034. }
  1035. }*/
  1036. SendNetMsg(tmpSendHC);
  1037. }
  1038. PQIUpdataList.clear();
  1039. if (m_DcSysMG!=nullptr)
  1040. {
  1041. m_DcSysMG->GetRectiterVPublish(PQIUpdataList); //直流侧:获取整流器电压
  1042. }
  1043. for(size_t j=0;j<PQIUpdataList.size();j++)
  1044. {
  1045. RAIYWAYV updatadata; //接触网到轨道的电压
  1046. if (MRunLineID == 200)
  1047. {
  1048. updatadata.V= PQIUpdataList[j].V/2;
  1049. }
  1050. else
  1051. {
  1052. updatadata.V= PQIUpdataList[j].V;
  1053. }
  1054. //V为1500v,V/2为第三轨的750V
  1055. updatadata.station = PQIUpdataList[j].StationID; //编号
  1056. OCCCOMMAND tmpSendHC;
  1057. tmpSendHC.setPacketValue(&updatadata,OCCCOMMAND::eUpdateRailWayV);
  1058. tmpSendHC.DesSysType=OCC_SYS_DD_GROUP;
  1059. tmpSendHC.TrainningID = m_trianid;
  1060. tmpSendHC.ScrSysType=OCC_SYS_DD_SVR;
  1061. SendNetMsg(tmpSendHC);
  1062. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[j].StationID,"201",POWERVALUE_DATATYPE_V,PQIUpdataList[j].V/2);
  1063. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[j].StationID,"202",POWERVALUE_DATATYPE_V,PQIUpdataList[j].V/2);
  1064. }
  1065. PQIUpdataList.clear();
  1066. if (m_DcSysMG!=nullptr)
  1067. {
  1068. m_DcSysMG->GetBackVIPublish(PQIUpdataList); //直流侧:获取回流线电流电压发布数据
  1069. }
  1070. for(size_t c=0;c<PQIUpdataList.size();c++)
  1071. {
  1072. BACKLINEVI updatadata; //回流线电力数据
  1073. if (MRunLineID == 200)
  1074. {
  1075. updatadata.V= PQIUpdataList[c].V/2;
  1076. }
  1077. else
  1078. {
  1079. updatadata.V= PQIUpdataList[c].V;
  1080. }
  1081. updatadata.StationID = PQIUpdataList[c].StationID; //电站编号
  1082. updatadata.DownNextI = PQIUpdataList[c].P; //下行下一区段电流
  1083. updatadata.DownPreI = PQIUpdataList[c].Q; //下行前一区段电流
  1084. updatadata.UpNextI = PQIUpdataList[c].OutputI; //上行下一区段电流
  1085. updatadata.UpPreI = PQIUpdataList[c].InputI; //上行前一区段电流
  1086. OCCCOMMAND tmpSendHC;
  1087. tmpSendHC.setPacketValue(&updatadata,OCCCOMMAND::eUpdateBackLineVI);
  1088. tmpSendHC.DesSysType=OCC_SYS_DD_GROUP;
  1089. tmpSendHC.TrainningID = m_trianid;
  1090. tmpSendHC.ScrSysType=OCC_SYS_DD_SVR;
  1091. SendNetMsg(tmpSendHC);
  1092. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[c].StationID,"211",POWERVALUE_DATATYPE_V,updatadata.V);//保存电力数据
  1093. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[c].StationID,"212",POWERVALUE_DATATYPE_V,updatadata.V);
  1094. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[c].StationID,"213",POWERVALUE_DATATYPE_V,updatadata.V);
  1095. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[c].StationID,"214",POWERVALUE_DATATYPE_V,updatadata.V);
  1096. //其中“211”为设置列车运行模式
  1097. //212设置列车临时限速
  1098. //213修改列车运行等级
  1099. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[c].StationID,"211",POWERVALUE_DATATYPE_I,updatadata.DownPreI);
  1100. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[c].StationID,"212",POWERVALUE_DATATYPE_I,updatadata.UpPreI);
  1101. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[c].StationID,"213",POWERVALUE_DATATYPE_I,updatadata.DownNextI);
  1102. m_DataBaseManger.SavePowerValue(m_trianid,PQIUpdataList[c].StationID,"214",POWERVALUE_DATATYPE_I,updatadata.UpNextI);
  1103. }
  1104. PQIUpdataList.clear();
  1105. //if (m_DcSysMG!=nullptr)
  1106. //{
  1107. // m_DcSysMG->GetTrianVPublish(PQIUpdataList); //直流侧:得到列车电压发布数据
  1108. //}
  1109. //for(size_t j=0;j<PQIUpdataList.size();j++)
  1110. //{
  1111. // TRIANV updatadata;
  1112. // updatadata.Trianid=PQIUpdataList[j].ID;
  1113. // if (updatadata.Trianid>0 &&updatadata.Trianid < 1000)
  1114. // {
  1115. // if (MRunLineID == 200)
  1116. // {
  1117. // updatadata.V= PQIUpdataList[j].V/2;
  1118. // }
  1119. // else
  1120. // {
  1121. // updatadata.V= PQIUpdataList[j].V;
  1122. // }
  1123. //
  1124. // OCCCOMMAND tmpSendHC;
  1125. // tmpSendHC.setPacketValue(&updatadata,OCCCOMMAND::eUpdateTrainV);
  1126. // tmpSendHC.DesSysType=OCC_SYS_XD_SVR;
  1127. // tmpSendHC.TrainningID = m_trianid;
  1128. // tmpSendHC.ScrSysType=OCC_SYS_DD_SVR;
  1129. // SendNetMsg(tmpSendHC);
  1130. // TRACE("列车:%d 网压:%f\n",updatadata.Trianid,updatadata.V);
  1131. // }
  1132. //}
  1133. map<int,DCSysTrain> TrainMap;
  1134. if (m_DcSysMG != nullptr)
  1135. {
  1136. TrainMap = m_DcSysMG->TrainSInStationMap;
  1137. }
  1138. map<int,DCSysTrain>::iterator iter =TrainMap.begin();
  1139. while(iter!=TrainMap.end())
  1140. {
  1141. string touchnet = m_DcSysMG->GetTouchNetByPosition(iter->second.LineSectionID,iter->second.excursion);
  1142. if (touchnet!="")
  1143. {
  1144. ELEEQPMTMAP::iterator iterEqpmet=ElectricEqpmtMap.find(touchnet);
  1145. if (iterEqpmet!=ElectricEqpmtMap.end())
  1146. {
  1147. TRIANV updatadata;
  1148. updatadata.Trianid=iter->second.ID;
  1149. if (iterEqpmet->second->GetStatus())
  1150. {
  1151. updatadata.V=1593.0;
  1152. }
  1153. else
  1154. {
  1155. updatadata.V= 0.0;
  1156. }
  1157. OCCCOMMAND tmpSendHC;
  1158. tmpSendHC.setPacketValue(&updatadata,OCCCOMMAND::eUpdateTrainV);
  1159. tmpSendHC.DesSysType=OCC_SYS_XD_SVR;
  1160. tmpSendHC.TrainningID = m_trianid;
  1161. tmpSendHC.ScrSysType=OCC_SYS_DD_SVR;
  1162. SendNetMsg(tmpSendHC);
  1163. //TRACE("列车:%d 网压:%f\n",updatadata.Trianid,updatadata.V);
  1164. }
  1165. }
  1166. iter++;
  1167. }
  1168. //Sleep(TIMESPAN_LVN);
  1169. std::this_thread::sleep_for(std::chrono::milliseconds(TIMESPAN_LVS));
  1170. return true;
  1171. }
  1172. //////////////////////////////////////////////////////////////////////////
  1173. // 对象计算辅助函数
  1174. // 返回true表示需要重设时间
  1175. bool ElectricityVOC::ObjectCPAss(const time_t &time, const time_t &lpTimeSpan)//电力模型计算,time线程时间,lpTimeSpan计算周期时间跨度
  1176. {
  1177. //只允许在课程运行阶段进行逻辑判断
  1178. if ( m_RunStatus != DISPATCH_RUN_STATUS_RUNNING
  1179. && m_RunStatus != DISPATCH_RUN_STATUS_RUNINT)
  1180. {
  1181. return false;
  1182. }
  1183. m_bObjectCPThreadFinish = false;
  1184. //MOD BY yangs
  1185. //if(m_RunStatus!= DISPATCH_RUN_STATUS_RUNNING) return false; //只允许在课程运行阶段进行逻辑判断
  1186. if (m_RunStatus == DISPATCH_RUN_STATUS_RUNNING)
  1187. {
  1188. //m_RunTime = (CTime::GetCurrentTime().GetTime()-m_RunBeginTime) + m_TrainBeginTime; //记录当前仿真时间
  1189. //m_CurTime = CTime::GetCurrentTime().GetTime(); //记录当前物理时间
  1190. // 获取当前时间毫秒数
  1191. auto now = std::chrono::duration_cast<std::chrono::milliseconds>(
  1192. std::chrono::system_clock::now().time_since_epoch()).count();
  1193. // 计算运行时间
  1194. m_RunTime = (now - m_RunBeginTime) + m_TrainBeginTime;
  1195. m_CurTime = now;
  1196. /*************************以下本函数原来的部分********************************/
  1197. if (m_BeginTimeElectricity < 0) {
  1198. //m_BeginTimeElectricity = CTime::GetCurrentTime().GetTime();
  1199. m_BeginTimeElectricity = std::chrono::duration_cast<std::chrono::milliseconds>(
  1200. std::chrono::system_clock::now().time_since_epoch()).count();
  1201. }
  1202. m_ElectricEvent.DealThirdTrackPowerLose();
  1203. if (lpTimeSpan > 1)
  1204. {
  1205. //add by chenht 2020 0723
  1206. /*if ( MRunLineID == 1400
  1207. || MRunLineID == 400
  1208. || MRunLineID == 300
  1209. || MRunLineID == 314
  1210. || MRunLineID == 324
  1211. || MRunLineID == 331
  1212. || MRunLineID == 325)*/
  1213. {
  1214. ElcTrackInfo_2_XD();
  1215. m_bObjectCPThreadFinish = true;
  1216. return true;
  1217. }
  1218. //2011-10-8无法运行时候屏蔽
  1219. if (m_DcSysMG==nullptr)
  1220. {
  1221. m_bObjectCPThreadFinish = true;
  1222. return false;
  1223. }
  1224. m_DcSysMG->CreateFixYNodes();
  1225. m_DcSysMG->CheckSpanNetInfo(); //added by zhangjiahua
  1226. m_DcSysMG->AdjustShortCutNode();
  1227. m_DcSysMG->CalculValue(); //计算直流信息数据
  1228. if (m_DcSysMG->HaveRightResult()) //计算电力模型,计算结果正确性的判断
  1229. {
  1230. //2011-10-8无法运行时候屏蔽
  1231. if (m_AcSysMG==nullptr)
  1232. {
  1233. m_bObjectCPThreadFinish = true;
  1234. return false;
  1235. }
  1236. UpdateACPowerLineStatus_Init();
  1237. UpdateNodeStatus_Init();
  1238. if (!m_AcSysMG->CreatePQNodeMatrix())
  1239. {
  1240. m_bObjectCPThreadFinish = true;
  1241. return false;
  1242. }
  1243. if (m_AcSysMG->RunCalValue()) //动态计算交流侧的相关电力值。。。。RunCalValue()交流侧计算(牛顿-拉夫逊 方法)
  1244. {
  1245. // if (m_timeturns>=3)
  1246. {
  1247. PublishData(); //发布网络消息
  1248. //SetEvent(m_hExit); //潮流计算完成后,将设备电气量更新事件触发,置为有信号状态:ObjectPowerValueUpdateAss xyx注释
  1249. m_timeturns=0;
  1250. }
  1251. m_timeturns++;
  1252. }
  1253. else
  1254. {
  1255. //TRACE("电力调度交流计算未收敛!\n");
  1256. }
  1257. }
  1258. else
  1259. {
  1260. m_DcSysMG->OutPutTrainSMap();
  1261. //TRACE("电力调度直流计算未收敛!\n");
  1262. }
  1263. m_DcSysMG->DeleteSpanNetInfo(); //added by zhangjiahua
  1264. m_bObjectCPThreadFinish = true;
  1265. return true;
  1266. }
  1267. /*************************以上本函数原来的部分********************************/
  1268. }
  1269. else
  1270. {
  1271. m_bObjectCPThreadFinish = true;
  1272. return false;
  1273. }
  1274. m_bObjectCPThreadFinish = true;
  1275. return false;
  1276. }
  1277. bool ElectricityVOC::InitSubSysDBDate(int courseid,int parm1,int parm2,InitCourInfo* curseinfo)
  1278. {
  1279. m_TrainBeginTime = parm2;
  1280. m_RunTime = m_TrainBeginTime;
  1281. InitDDRunLineID();
  1282. m_ElectricEvent.SetCourseID(courseid);//added by zhangjiahua
  1283. printf("-------------ElectricityVOC-InitSubSysDBDate-begin--------------------\r");
  1284. if (m_DataBaseManger.InitDataBase(m_pDataBaseOper,courseid, MRunLineID))
  1285. {
  1286. //读取设备数据前先读取设备基础定义
  1287. if (!InitDDServerConfig())
  1288. {
  1289. return false;
  1290. }
  1291. if (!InitBaseEqpmtDefineInfo())
  1292. {
  1293. return false;
  1294. }
  1295. if (!m_DataBaseManger.GetPowerStationFromDB(m_MI_powerstation)) //从数据库获得车站的数据
  1296. {
  1297. return false;
  1298. }
  1299. BaseElectricEqpmt::m_stationMap=m_MI_powerstation;
  1300. m_ElectricEvent.m_MI_powerstation=m_MI_powerstation;//added by zhangjiahua
  1301. if ( !m_DataBaseManger.GetRepeatShutData() || !m_DataBaseManger.GetErrorToProtectData() )
  1302. {
  1303. return false;
  1304. }
  1305. printf("-------------ElectricityVOC-InitSubSysDBDate-GetEqpmtsFromDB--------------------\r");
  1306. if (!m_DataBaseManger.GetEqpmtsFromDB(&ElectricEqpmtMap))
  1307. {
  1308. return false;
  1309. }
  1310. printf("-------------ElectricityVOC-InitSubSysDBDate-GetEqpmt_TouchNet_FromDB--------------------\r");
  1311. if (m_DcSysMG!=nullptr&&!m_DataBaseManger.GetEqpmt_TouchNet_FromDB(&ElectricEqpmtMap,m_DcSysMG->GetTouchNetMap()))
  1312. {
  1313. return false;
  1314. }
  1315. if (!m_DataBaseManger.GetEqpmt_TouchNet_Track_Relation_FromDB(*m_DcSysMG))
  1316. {
  1317. return false;
  1318. }
  1319. if (!m_DataBaseManger.GetEqpmt_InPutRelation_FromDB(&ElectricEqpmtMap))
  1320. {
  1321. return false;
  1322. }
  1323. if ( !m_DataBaseManger.UpdateProtectLockingEqpmt(&ElectricEqpmtMap) )
  1324. {
  1325. return false;
  1326. }
  1327. if (!m_DataBaseManger.UpdateFaultSceneLockingEqpmt(&ElectricEqpmtMap))
  1328. {
  1329. return false;
  1330. }
  1331. if (!m_DataBaseManger.InitDC_StationInfo(*m_DcSysMG))
  1332. {
  1333. return false;
  1334. }
  1335. if (!m_DataBaseManger.InitAc_PowerLineInfo((*m_AcSysMG)))
  1336. {
  1337. return false;
  1338. }
  1339. if (!m_DataBaseManger.InitAc_PowerCalNodeInfo((*m_AcSysMG)))
  1340. {
  1341. return false;
  1342. }
  1343. if (!m_DataBaseManger.InitAc_PowerLineSwitch(*m_AcSysMG)) //added by zhangjiahua
  1344. {
  1345. return false;
  1346. }
  1347. if (!m_DataBaseManger.GetMultiModeData(m_MultiModeMap))
  1348. {
  1349. return false;
  1350. }
  1351. if (!m_DataBaseManger.GetModeInfoData(m_ModeDataMap,m_ModeIDDataMap))
  1352. {
  1353. return false;
  1354. }
  1355. if (!m_DataBaseManger.GetEqpmtAlarmInfoFromDB(&m_ElcEqpmtAlarmInfoMap))
  1356. {
  1357. return false;
  1358. }
  1359. BaseElectricEqpmt::SetElcEqpmtAlarmInfoMap(&m_ElcEqpmtAlarmInfoMap);
  1360. if (MRunLineID == 200)
  1361. {
  1362. }
  1363. else /*if(MRunLineID == 300||MRunLineID == 400||MRunLineID == 500||MRunLineID == 600)*/
  1364. {
  1365. if (!m_DataBaseManger.GetTrackRelationXDData(m_TrackRelationXDMap))
  1366. {
  1367. return false;
  1368. }
  1369. //if (nullptr !=m_pBaseElcEqpmt)
  1370. {
  1371. BaseElectricEqpmt::SetTrackRelationXDMap(m_TrackRelationXDMap);
  1372. }
  1373. }
  1374. if ( !m_DataBaseManger.LoadTelesignalisationData(m_ElectricEvent.m_TelesignalisationMng, &ElectricEqpmtMap) )
  1375. {
  1376. return false;
  1377. }
  1378. if ( !m_DataBaseManger.LoadElcTurnOffAreaData( &ElectricEqpmtMap, m_ElectricEvent.m_ElcTurnOffAreaMng) )
  1379. {
  1380. return false;
  1381. }
  1382. if ( !m_DataBaseManger.LoadElcEqpmtAutoBoltLogic(&ElectricEqpmtMap) )
  1383. {
  1384. return false;
  1385. }
  1386. if ( !m_DataBaseManger.LoadStation400VLoadMng( &m_ElectricEvent.m_400VLoadMng, &ElectricEqpmtMap ) )
  1387. {
  1388. return false;
  1389. }
  1390. if (!m_DataBaseManger.GetEqpmtTelemeteryValue(m_mapEqpmtTelemetryInfo))
  1391. {
  1392. return false;
  1393. }
  1394. if (MRunLineID == 1100)
  1395. {
  1396. if (!m_DataBaseManger.GetEqpmt_EarthSwitchRelation_FromDB(&ElectricEqpmtMap))
  1397. {
  1398. return false;
  1399. }
  1400. }
  1401. if ( !m_DataBaseManger.GetElectric_EqpmtStatusToIBPLight_FromDB( m_ElectricEvent.m_MIEqpmtStatusToIBPLight ) )
  1402. {
  1403. return false;
  1404. }
  1405. // 获取真实设备映射
  1406. if (!m_DataBaseManger.loadRealEqpmtRelationFromDB(&ElectricEqpmtMap))
  1407. {
  1408. return false;
  1409. }
  1410. m_AcSysMG->SetEqpmentMap(&ElectricEqpmtMap);
  1411. //SetElectricEqpmtMap(ElectricEqpmtMap);
  1412. SetPowerValueUpdateEqpmt(&ElectricEqpmtMap);
  1413. }
  1414. printf("-------------ElectricityVOC-InitSubSysDBDate-end--------------------\r");
  1415. return true;
  1416. }
  1417. bool ElectricityVOC::StartTask(int& ret)//开始
  1418. {
  1419. printf("-------------ElectricityVOC-StartTask-begin--------------------\r");
  1420. //m_RunStatus=DISPATCH_RUN_STATUS_RUNNING;
  1421. //m_DcSysMG->SetRunStatus(m_RunStatus);
  1422. if (m_RunStatus != DISPATCH_RUN_STATUS_RUNINT
  1423. && m_RunStatus != DISPATCH_RUN_STATUS_RUNNING)
  1424. {
  1425. m_RunStatus = DISPATCH_RUN_STATUS_RUNNING;
  1426. m_DcSysMG->SetRunStatus(m_RunStatus);
  1427. printf("-------------ElectricityVOC-StartTask-end--------------------\r");
  1428. return true;
  1429. }
  1430. else
  1431. {
  1432. return false;
  1433. }
  1434. printf("-------------ElectricityVOC-StartTask-end--------------------\r");
  1435. return true;
  1436. }
  1437. bool ElectricityVOC::StopTask(int& ret)
  1438. {
  1439. m_RunStatus=DISPATCH_RUN_STATUS_STOP;
  1440. m_DcSysMG->SetRunStatus(m_RunStatus);
  1441. return true;
  1442. }
  1443. bool ElectricityVOC::PauseTask(int& ret)
  1444. {
  1445. m_RunStatus=DISPATCH_RUN_STATUS_PAUSE;
  1446. m_DcSysMG->SetRunStatus(m_RunStatus);
  1447. return true;
  1448. }
  1449. bool ElectricityVOC::ResumeTask(int& ret)
  1450. {
  1451. m_RunStatus=DISPATCH_RUN_STATUS_RUNNING;
  1452. m_DcSysMG->SetRunStatus(m_RunStatus);
  1453. return true;
  1454. }
  1455. void ElectricityVOC::InitDDRunLineID()
  1456. {
  1457. string Str_FileName = GetFolder_AppEXE_2() + "/ParamSetting.ini";
  1458. int nCourseRunLineID = m_nRunLineID;
  1459. m_DataBaseManger.m_nLineID = ReadCfg_Int(Str_FileName,"DDDATABASE", "RunLineID", nCourseRunLineID);
  1460. MRunLineID = m_DataBaseManger.m_nLineID;
  1461. }
  1462. bool ElectricityVOC::InitDDServerConfig()
  1463. {
  1464. if (m_DataBaseManger.initDDServerConfigInfo())
  1465. {
  1466. PQValuesArray = new DCNodePQValue[All_Power_Station_Nums];
  1467. m_AcSysMG = new ACSysMG();
  1468. m_DcSysMG = new DCSysMG();
  1469. if (m_AcSysMG == nullptr || m_DcSysMG == nullptr)
  1470. {
  1471. return false;
  1472. }
  1473. }
  1474. else
  1475. {
  1476. return false;
  1477. }
  1478. return true;
  1479. }
  1480. bool ElectricityVOC::InitBaseEqpmtDefineInfo()
  1481. {
  1482. return m_DataBaseManger.initBaseEqpmtDefineInfo();
  1483. }
  1484. //void ElectricityVOC::SendControlPermission()
  1485. //{
  1486. // for (int i=0;i<m_MI_powerstation.size();i++)
  1487. // {
  1488. // CONTROLPERMISSION controlperssion;
  1489. // controlperssion.nStationID=m_MI_powerstation[i].stationID;
  1490. // controlperssion.nControlArea=m_MI_powerstation[i].ctrlarea;
  1491. // OCCCOMMAND tmpSendHC;
  1492. // tmpSendHC.setPacketValue(&controlperssion,OCCCOMMAND::eUpdateSendControlPermission);
  1493. // tmpSendHC.DesSysType=OCC_SYS_DD_CLIENT;
  1494. // tmpSendHC.TrainningID = m_trianid;
  1495. // tmpSendHC.ScrSysType=OCC_SYS_DD_SVR;
  1496. // SendNetMsg(tmpSendHC);
  1497. // }
  1498. //}
  1499. void ElectricityVOC::UpdateEqpmtPowerValue() //发送电量值给客户端 xyx新增
  1500. {
  1501. //EnterCriticalSection(&EqpmtMapCriticalSection);
  1502. //ELEEQPMTMAP::iterator iterEqpmt=ElectricEqpmtMap.begin();
  1503. //for (;iterEqpmt!=ElectricEqpmtMap.end();iterEqpmt++)
  1504. //ELEEQPMTMAP::iterator iterEqpmt=m_mapPowerValueUpdateEqpmt.begin();
  1505. //for (;iterEqpmt!=m_mapPowerValueUpdateEqpmt.end();iterEqpmt++)
  1506. ELEEQPMTMAP::iterator iterEqpmt=ElectricEqpmtMap.begin();
  1507. for (;iterEqpmt!=ElectricEqpmtMap.end();iterEqpmt++)
  1508. {
  1509. ELCEQPMTPOWERVALUEUPDATE *pEqpmtPowerValue=nullptr;
  1510. std::string EqpmtID=iterEqpmt->first;
  1511. if (OCC_EQPMTTYPE_110kVBreaker==iterEqpmt->second->GetBaseType() //交流断路器电力数据更新
  1512. ||OCC_EQPMTTYPE_35kVBREAKER==iterEqpmt->second->GetBaseType()
  1513. ||OCC_EQPMTTYPE_400vACControlBreaker==iterEqpmt->second->GetBaseType())
  1514. {
  1515. pEqpmtPowerValue=new ELCEQPMTPOWERVALUEUPDATE();
  1516. strncpy(pEqpmtPowerValue->EqpmtUnitID,EqpmtID.c_str(),sizeof(pEqpmtPowerValue->EqpmtUnitID));
  1517. pEqpmtPowerValue->Ia = iterEqpmt->second->m_EqpmtPowerValue.Ia;
  1518. pEqpmtPowerValue->Ib = iterEqpmt->second->m_EqpmtPowerValue.Ib;
  1519. pEqpmtPowerValue->Ic = iterEqpmt->second->m_EqpmtPowerValue.Ic;
  1520. pEqpmtPowerValue->S = iterEqpmt->second->m_EqpmtPowerValue.S;
  1521. pEqpmtPowerValue->P = iterEqpmt->second->m_EqpmtPowerValue.P;
  1522. pEqpmtPowerValue->Q = iterEqpmt->second->m_EqpmtPowerValue.Q;
  1523. pEqpmtPowerValue->PF = iterEqpmt->second->m_EqpmtPowerValue.PF;
  1524. pEqpmtPowerValue->Forward_P = iterEqpmt->second->m_EqpmtPowerValue.Forward_P;
  1525. pEqpmtPowerValue->Forward_Q = iterEqpmt->second->m_EqpmtPowerValue.Forward_Q;
  1526. pEqpmtPowerValue->Backward_P = iterEqpmt->second->m_EqpmtPowerValue.Backward_P;
  1527. pEqpmtPowerValue->Backward_Q = iterEqpmt->second->m_EqpmtPowerValue.Backward_Q;
  1528. if (OCC_EQPMTTYPE_110kVBreaker==iterEqpmt->second->GetBaseType() //110kV、35kV断路器电压(kV)、参数显示的位置区分
  1529. ||OCC_EQPMTTYPE_35kVBREAKER==iterEqpmt->second->GetBaseType())
  1530. {
  1531. pEqpmtPowerValue->Ua = iterEqpmt->second->m_EqpmtPowerValue.Ua;
  1532. pEqpmtPowerValue->Ub = iterEqpmt->second->m_EqpmtPowerValue.Ub;
  1533. pEqpmtPowerValue->Uc = iterEqpmt->second->m_EqpmtPowerValue.Uc;
  1534. pEqpmtPowerValue->Uab = iterEqpmt->second->m_EqpmtPowerValue.Uab;
  1535. pEqpmtPowerValue->Ubc = iterEqpmt->second->m_EqpmtPowerValue.Ubc;
  1536. pEqpmtPowerValue->Uca = iterEqpmt->second->m_EqpmtPowerValue.Uca;
  1537. }
  1538. else if(OCC_EQPMTTYPE_400vACControlBreaker==iterEqpmt->second->GetBaseType()) //400V断路器电压(V)、参数显示的位置区分
  1539. {
  1540. pEqpmtPowerValue->Ua = iterEqpmt->second->m_EqpmtPowerValue.Ua*1000;
  1541. pEqpmtPowerValue->Ub = iterEqpmt->second->m_EqpmtPowerValue.Ub*1000;
  1542. pEqpmtPowerValue->Uc = iterEqpmt->second->m_EqpmtPowerValue.Uc*1000;
  1543. pEqpmtPowerValue->Uab = iterEqpmt->second->m_EqpmtPowerValue.Uab*1000;
  1544. pEqpmtPowerValue->Ubc = iterEqpmt->second->m_EqpmtPowerValue.Ubc*1000;
  1545. pEqpmtPowerValue->Uca = iterEqpmt->second->m_EqpmtPowerValue.Uca*1000;
  1546. }
  1547. pEqpmtPowerValue->Position = iterEqpmt->second->m_EqpmtPowerValue.Position;
  1548. }
  1549. else if (OCC_EQPMTTYPE_110kVACMLine==iterEqpmt->second->GetBaseType() //交流母线电力数据更新
  1550. ||OCC_EQPMTTYPE_35kVMOTHERLINE==iterEqpmt->second->GetBaseType()
  1551. ||OCC_EQPMTTYPE_400vACMLine==iterEqpmt->second->GetBaseType())
  1552. {
  1553. pEqpmtPowerValue=new ELCEQPMTPOWERVALUEUPDATE();
  1554. strncpy(pEqpmtPowerValue->EqpmtUnitID,EqpmtID.c_str(), sizeof(pEqpmtPowerValue->EqpmtUnitID));
  1555. if (OCC_EQPMTTYPE_110kVACMLine==iterEqpmt->second->GetBaseType() //110kV、35kV母线线电压(kV)
  1556. ||OCC_EQPMTTYPE_35kVMOTHERLINE==iterEqpmt->second->GetBaseType())
  1557. {
  1558. pEqpmtPowerValue->Uab = iterEqpmt->second->m_EqpmtPowerValue.Uab;
  1559. pEqpmtPowerValue->Ubc = iterEqpmt->second->m_EqpmtPowerValue.Ubc;
  1560. pEqpmtPowerValue->Uca = iterEqpmt->second->m_EqpmtPowerValue.Uca;
  1561. }
  1562. else if (OCC_EQPMTTYPE_400vACMLine==iterEqpmt->second->GetBaseType()) //400V母线线电压(V)
  1563. {
  1564. pEqpmtPowerValue->Uab = iterEqpmt->second->m_EqpmtPowerValue.Uab*1000;
  1565. pEqpmtPowerValue->Ubc = iterEqpmt->second->m_EqpmtPowerValue.Ubc*1000;
  1566. pEqpmtPowerValue->Uca = iterEqpmt->second->m_EqpmtPowerValue.Uca*1000;
  1567. }
  1568. pEqpmtPowerValue->Position = iterEqpmt->second->m_EqpmtPowerValue.Position;
  1569. }
  1570. else if ( OCC_EQPMTTYPE_BREAKER_DC==iterEqpmt->second->GetBaseType() //直流侧电力数据更新
  1571. ||OCC_EQPMTTYPE_1500vDCMLine==iterEqpmt->second->GetBaseType() )
  1572. {
  1573. pEqpmtPowerValue=new ELCEQPMTPOWERVALUEUPDATE();
  1574. strncpy(pEqpmtPowerValue->EqpmtUnitID, EqpmtID.c_str(), sizeof(pEqpmtPowerValue->EqpmtUnitID));
  1575. if (OCC_EQPMTTYPE_BREAKER_DC==iterEqpmt->second->GetBaseType()) //直流断路器电压(V)、电流(A)
  1576. {
  1577. pEqpmtPowerValue->U = iterEqpmt->second->m_EqpmtPowerValue.U;
  1578. pEqpmtPowerValue->I = iterEqpmt->second->m_EqpmtPowerValue.I;
  1579. pEqpmtPowerValue->Position = iterEqpmt->second->m_EqpmtPowerValue.Position;
  1580. }
  1581. else if (OCC_EQPMTTYPE_1500vDCMLine==iterEqpmt->second->GetBaseType()) //直流母线电压(V)
  1582. {
  1583. pEqpmtPowerValue->U = iterEqpmt->second->m_EqpmtPowerValue.U;
  1584. pEqpmtPowerValue->Position =iterEqpmt->second->m_EqpmtPowerValue.Position;
  1585. }
  1586. }
  1587. if (pEqpmtPowerValue!=nullptr && pEqpmtPowerValue->Position!= -1)
  1588. {
  1589. OCCCOMMAND tmpSendHC;
  1590. tmpSendHC.setPacketValue(pEqpmtPowerValue,OCCCOMMAND::eUpdateEqpmtPowerValue);
  1591. tmpSendHC.DesSysType = OCC_SYS_DD_GROUP;//目的系统,电调组播
  1592. tmpSendHC.TrainningID = m_trianid;//训练编号
  1593. tmpSendHC.ScrSysType = OCC_SYS_DD_SVR;//电调服务端
  1594. SendNetMsg(tmpSendHC);
  1595. }
  1596. delete pEqpmtPowerValue;
  1597. }
  1598. //LeaveCriticalSection(&EqpmtMapCriticalSection);
  1599. }
  1600. void ElectricityVOC::SetPowerValueUpdateEqpmt( ELEEQPMTMAP *Elceqpmtmap )
  1601. {
  1602. ELEEQPMTMAP::iterator iterEqpmt=ElectricEqpmtMap.begin();
  1603. for (;iterEqpmt!=ElectricEqpmtMap.end();iterEqpmt++)
  1604. {
  1605. if ( OCC_EQPMTTYPE_110kVBreaker==iterEqpmt->second->GetBaseType()
  1606. ||OCC_EQPMTTYPE_35kVBREAKER==iterEqpmt->second->GetBaseType()
  1607. ||OCC_EQPMTTYPE_400vACControlBreaker==iterEqpmt->second->GetBaseType()
  1608. ||OCC_EQPMTTYPE_BREAKER_DC==iterEqpmt->second->GetBaseType()
  1609. ||OCC_EQPMTTYPE_110kVACMLine==iterEqpmt->second->GetBaseType()
  1610. ||OCC_EQPMTTYPE_35kVMOTHERLINE==iterEqpmt->second->GetBaseType()
  1611. ||OCC_EQPMTTYPE_400vACMLine==iterEqpmt->second->GetBaseType()
  1612. ||OCC_EQPMTTYPE_1500vDCMLine==iterEqpmt->second->GetBaseType() )
  1613. {
  1614. ELEEQPMTMAP::iterator iterPowerEqpmt=m_mapPowerValueUpdateEqpmt.find(iterEqpmt->first);
  1615. if (iterPowerEqpmt==m_mapPowerValueUpdateEqpmt.end())
  1616. {
  1617. m_mapPowerValueUpdateEqpmt.insert(make_pair(iterEqpmt->first,iterEqpmt->second));
  1618. }
  1619. }
  1620. }
  1621. }
  1622. void ElectricityVOC::ModeControlDeal( int nModeID, int nModeStatus )
  1623. {
  1624. string str_EqpmtID;
  1625. int n_DesStatus;
  1626. string str_StdId;
  1627. int n_CtrlType;
  1628. MODEIDDATAMAP::iterator iterModeID = m_ModeIDDataMap.find(nModeID);
  1629. if ( iterModeID!= m_ModeIDDataMap.end())
  1630. {
  1631. if ( MODECTRL_STATUS_RUNING == nModeStatus)
  1632. {
  1633. map<int,MODEDATA> mapModeIndex;
  1634. mapModeIndex=iterModeID->second;
  1635. map<int,MODEDATA>::iterator iterModeIndex= mapModeIndex.begin();
  1636. for (;iterModeIndex!=mapModeIndex.end();iterModeIndex++)
  1637. {
  1638. str_EqpmtID = iterModeIndex->second.strid;
  1639. n_DesStatus = iterModeIndex->second.dstatus;
  1640. str_StdId = "系统";
  1641. n_CtrlType = CTRLTYPE_STATUS;
  1642. NORMALCMDC NCmd;
  1643. m_ElectricEvent.EqpmtCtrl(NCmd,str_EqpmtID,n_DesStatus,str_StdId,n_CtrlType);
  1644. }
  1645. }
  1646. }
  1647. }
  1648. void ElectricityVOC::ElcTrackInfo_2_XD()
  1649. {
  1650. //发布接触轨带电信息
  1651. ELEEQPMTMAP::iterator iterEqpmtMap;
  1652. TrackRelationXDMAP::iterator iterTrackMap = m_TrackRelationXDMap.begin();
  1653. for (;iterTrackMap != m_TrackRelationXDMap.end();iterTrackMap++)
  1654. {
  1655. iterEqpmtMap = ElectricEqpmtMap.find(iterTrackMap->second->m_strID);
  1656. if (iterEqpmtMap != ElectricEqpmtMap.end())
  1657. {
  1658. if (iterEqpmtMap->second->m_TrackRelationXD.m_PreIsPower != -1)
  1659. {
  1660. //itetrackXD->second->m_IsPower = trackpower;
  1661. COMMANDTOXD cmdtoxd;
  1662. cmdtoxd.type = DDTOXD_ELCTRACK_STATUS;
  1663. cmdtoxd.ObjectID = iterEqpmtMap->second->m_TrackRelationXD.m_NoID;
  1664. cmdtoxd.data1 = iterEqpmtMap->second->m_TrackRelationXD.m_IsPower;
  1665. cmdtoxd.data2 = iterEqpmtMap->second->m_TrackRelationXD.m_Direction;
  1666. OCCCOMMAND tmpSendOC;
  1667. tmpSendOC.cmdType = OCCCOMMAND::CmdType::eCommantoXD;
  1668. //tmpSendOC.DesSysType = OCC_SYS_XD_CLIENT;
  1669. tmpSendOC.DesSysType = OCC_SYS_XD_SVR;
  1670. tmpSendOC.ScrSysType = OCC_SYS_DD_SVR;
  1671. tmpSendOC.TrainningID = m_trianid;
  1672. tmpSendOC.DateLen = sizeof(COMMANDTOXD);
  1673. tmpSendOC.Net_LS_CommandtoXD = cmdtoxd;
  1674. m_pQI_SendCmdsList->push(tmpSendOC);
  1675. }
  1676. iterEqpmtMap->second->m_TrackRelationXD.m_PreIsPower = iterEqpmtMap->second->m_TrackRelationXD.m_IsPower;
  1677. }
  1678. }
  1679. /*
  1680. //发布列车电压
  1681. map<int,DCSysTrain>* pTrainMap = nullptr;
  1682. m_DcSysMG->EnterTrainSInStationMapCritilSec();
  1683. m_DcSysMG->SetElcEqpmtMap(ElectricEqpmtMap);
  1684. pTrainMap = m_DcSysMG->GetTrainSInStationMap();
  1685. if (pTrainMap == nullptr)
  1686. {
  1687. return;
  1688. }
  1689. map<int,DCSysTrain>::iterator iter =pTrainMap->begin();
  1690. while(iter!=pTrainMap->end())
  1691. {
  1692. string touchnet = m_DcSysMG->GetTouchNetByPosition(iter->second.LineSectionID,iter->second.excursion);
  1693. if (touchnet!="")
  1694. {
  1695. ELEEQPMTMAP::iterator iterEqpmet=ElectricEqpmtMap.find(touchnet);
  1696. if (iterEqpmet!=ElectricEqpmtMap.end())
  1697. {
  1698. TRIANV updatadata;
  1699. updatadata.Trianid=iter->second.ID;
  1700. if (iterEqpmet->second->GetStatus())
  1701. {
  1702. updatadata.V=1593.0;
  1703. }
  1704. else
  1705. {
  1706. updatadata.V= 0.0;
  1707. }
  1708. OCCCOMMAND tmpSendHC;
  1709. tmpSendHC.setPacketValue(&updatadata,OCCCOMMAND::eUpdateTrainV);
  1710. tmpSendHC.DesSysType=OCC_SYS_XD_SVR;
  1711. tmpSendHC.TrainningID = m_trianid;
  1712. tmpSendHC.ScrSysType=OCC_SYS_DD_SVR;
  1713. SendNetMsg(tmpSendHC);
  1714. TRACE("列车:%d 网压:%f\n",updatadata.Trianid,updatadata.V);
  1715. }
  1716. }
  1717. iter++;
  1718. }
  1719. m_DcSysMG->LeaveTrainSInStationMapCritilSec();
  1720. //发布列车电压结束
  1721. */
  1722. }
  1723. void ElectricityVOC::SendIniCmd()
  1724. {
  1725. EQPMTINITSTATUS oper;
  1726. oper.StationID = 0;
  1727. oper.Status = 0;
  1728. OCCCOMMAND occcommand;
  1729. //occcommand.DesNetID = m_nXDServerID;
  1730. occcommand.TrainningID = m_trianid;
  1731. occcommand.DesSysType = OCC_SYS_DD_CLIENT;
  1732. occcommand.ScrSysType = OCC_SYS_DD_SVR;
  1733. occcommand.setPacketValue(&oper, OCCCOMMAND::eUpdateEqpmtInitStatus);
  1734. m_pQI_SendCmdsList->push(occcommand);
  1735. }
  1736. //IBP接收事件
  1737. void ElectricityVOC::DealWith_IBPEvent( int nIBPSysID, int nCmdType, int nParam1, int nParam2,int nParam3, int nParam4, int nParam5, string& strParam1, string& strParam2, string& strParam3, string& strParam4, string& strParam5,int nStationID )
  1738. {
  1739. string strName = "IBP紧急分闸";
  1740. NORMALCMDC NCmd;
  1741. int n_CtrlType = CTRLTYPE_STATUS;
  1742. int n_DesStatus = 0;
  1743. string str_StdId = "IBP";
  1744. if ( Electric_IBPEvent_DCBreakerCtrl == nCmdType )
  1745. {
  1746. if (nParam5 < 1)
  1747. {
  1748. n_DesStatus = 1;
  1749. }
  1750. //对断路器停送电
  1751. vector<string> vecKey;
  1752. string strFindKey = ";";
  1753. if ( !strParam1.empty() )
  1754. {
  1755. vecKey = str_split_2( strParam1, strFindKey );
  1756. }
  1757. if ( !vecKey.empty() )
  1758. {
  1759. for (int i = 0;i < vecKey.size(); i++)
  1760. {
  1761. m_ElectricEvent.EqpmtCtrl(NCmd,vecKey[i],n_DesStatus,str_StdId,n_CtrlType);
  1762. }
  1763. }
  1764. }
  1765. }