ElectricityVOC.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #pragma once
  2. //#pragma comment(lib,"SubSysDispatch.lib")
  3. #include "BaseDispatch.h"
  4. #include "BaseDataStructDefine.h"
  5. #include "ElectricDataBaseManger.h"
  6. #include "PowerEventDeal.h"
  7. #include "ACSysMG.h"
  8. #include "DCSysMG.h"
  9. //#include "ElectricEqpmt_Line_TouchNet.h"
  10. #include <condition_variable>
  11. #include <mutex>
  12. #include <chrono>
  13. //#include <optional>
  14. // 定义 INFINITE 常量
  15. //constexpr uint32_t INFINITE = 0xFFFFFFFF;
  16. class ElcEvent
  17. {
  18. public:
  19. ElcEvent(bool manualReset = false, bool initialState = false)
  20. : m_manualReset(manualReset), m_signaled(initialState) {}
  21. void SetElcEvent()
  22. {
  23. std::unique_lock<std::mutex> lock(m_mutex);
  24. m_signaled = true;
  25. if (m_manualReset)
  26. {
  27. m_condition.notify_all();
  28. }
  29. else
  30. {
  31. m_condition.notify_one();
  32. }
  33. }
  34. void ResetElcEvent()
  35. {
  36. std::unique_lock<std::mutex> lock(m_mutex);
  37. m_signaled = false;
  38. }
  39. bool WaitElcEvent(uint32_t timeoutMs = 0xFFFFFFFF)
  40. {
  41. std::unique_lock<std::mutex> lock(m_mutex);
  42. if (timeoutMs == 0xFFFFFFFF)
  43. {
  44. m_condition.wait(lock, [this] { return m_signaled; });
  45. if (!m_manualReset)
  46. {
  47. m_signaled = false;
  48. }
  49. return true;
  50. }
  51. else
  52. {
  53. auto status = m_condition.wait_for(lock,
  54. std::chrono::milliseconds(timeoutMs),
  55. [this] { return m_signaled; });
  56. if (status && !m_manualReset)
  57. {
  58. m_signaled = false;
  59. }
  60. return status;
  61. }
  62. }
  63. private:
  64. bool m_manualReset;
  65. bool m_signaled;
  66. std::mutex m_mutex;
  67. std::condition_variable m_condition;
  68. };
  69. static ELECSTATIONMAP m_MI_powerstation; //变电站相关信息
  70. class ElectricityVOC : public CBaseDispatch //电调主类
  71. {
  72. public:
  73. ElectricityVOC(void);
  74. public:
  75. virtual~ElectricityVOC(void);
  76. virtual BOOL InitInstance();
  77. virtual int ExitInstance();
  78. //////////////////////////////////////////////////////////////////////////
  79. // 重要事件处理辅助函数
  80. // 返回true表示需要默认函数继续处理
  81. virtual bool EventF1Ass(NORMALCMDC&NCmd); //?函数的功能
  82. //////////////////////////////////////////////////////////////////////////
  83. // 普通事件处理辅助函数
  84. // 返回true表示需要默认函数继续处理
  85. virtual bool EventF2Ass(NORMALCMDC&NCmd); //?函数的功能
  86. //////////////////////////////////////////////////////////////////////////
  87. // 事件发起辅助函数
  88. // 返回true表示需要重设时间
  89. virtual bool EventBeginAss(const time_t &time, const time_t &lpTimeSpan);//?函数的功能
  90. //////////////////////////////////////////////////////////////////////////
  91. // 对象计算辅助函数
  92. // 返回true表示需要重设时间
  93. virtual bool ObjectCPAss(const time_t &time, const time_t &lpTimeSpan); //?此函数的功能和作用
  94. virtual bool InitSubSysDBDate(int courseid,int parm1,int parm2,InitCourInfo* curseinfo);//?此函数的功能和作用 InitSubSysDBDate(int courseid,int parm1,int parm2,InitCourInfo* curseinfo);
  95. virtual bool GetInteractiveCmds(bool flag);
  96. bool InitPowerStationData();
  97. bool AddStationToPointList();
  98. bool PublishData();
  99. void ElcTrackInfo_2_XD();//由于算法改变厦门未重做数据,造成全线停电不停车,将数据发布部分代码提出特殊处理 add by chenht 2020 0723
  100. void SendNetMsg(OCCCOMMAND& msg);
  101. void CheckTrainAccident(DCSysTrain& train);
  102. void UpdateACPowerLineStatus_Init(); //计算前更新交流侧支路初始状态
  103. void UpdateNodeStatus_Init(); //计算前更新交流侧节点初始状态
  104. void UpdateEqpmtPowerValue(); //更新设备的电量值 xyx新增
  105. virtual bool StartTask(int& ret);
  106. virtual bool StopTask(int& ret);
  107. virtual bool PauseTask(int& ret);
  108. virtual bool ResumeTask(int& ret);
  109. void InitDDRunLineID();
  110. bool InitDDServerConfig();
  111. bool InitBaseEqpmtDefineInfo();
  112. //void SendControlPermission();
  113. //************************************
  114. // 函数名称: ModeControlDeal
  115. // 函数功能: 模式控制处理
  116. // 函数类型: public
  117. // 返 回 值: void
  118. // 参数1说明: int nModeID 模式ID
  119. // 参数2说明: int nModeStatus 模式执行状态:开始、运行、暂停、继续、完成等
  120. // 作 者: xyx新增
  121. // 日 期: 2019/8/14
  122. // 修改记录:
  123. //************************************
  124. void ModeControlDeal(int nModeID, int nModeStatus);
  125. public:
  126. int64_t m_RunTime; //训练已运行时间,仿真时间,以int64为单位
  127. int64_t m_RunBeginTime; //训练开始时间,物理时间,以int64为单位
  128. int64_t m_TrainBeginTime; //训练初始时间,仿真时间,以秒为单位
  129. int64_t m_LastRunTime;
  130. int64_t m_CurTime; //当前时间,物理时间,以int64为单位
  131. protected:
  132. ElectricDataBaseManger m_DataBaseManger; //数据管理
  133. PowerEventDeal m_ElectricEvent; //电力故障
  134. DCSysMG *m_DcSysMG; //直流侧相关信息
  135. ACSysMG *m_AcSysMG; //交流侧相关信息
  136. ELEEQPMTMAP ElectricEqpmtMap; //电力设备相关信息
  137. //ELECSTATIONMAP m_MI_powerstation; //变电站相关信息
  138. std::recursive_mutex EqpmtMapCriticalSection;//设备互斥对象
  139. DCNodePQValue *PQValuesArray;//PQ节点数据
  140. MULTIMODEMAP m_MultiModeMap; //多组模式信息
  141. MODEDATAMAP m_ModeDataMap; //模式信息表
  142. MODEIDDATAMAP m_ModeIDDataMap; //模式ID映射信息表
  143. ELEEQPMTMAP m_mapPowerValueUpdateEqpmt; //需要更新电气参数的设备 xyx新增
  144. EQPMTTELEINFO m_mapEqpmtTelemetryInfo; // 设备遥测量波动相关信息
  145. public:
  146. TrackRelationXDMAP m_TrackRelationXDMap;
  147. BaseElectricEqpmt* m_pBaseElcEqpmt;
  148. bool m_ObjectPowerThreadOut; //设备电气量更新线程最后一个参数:退出线程 xyx新增
  149. static ELCEQPMTALARMINFOMAP m_ElcEqpmtAlarmInfoMap; //电调报警信息配置信息 xyx新增
  150. static ELCTOENVRELAINFOSTATIONMAP m_ElcToEnvRelaInfoStationInfoMap;
  151. public:
  152. void setDBP(YD_DBOperator* pDB, CFrameTool_I* pFrameTool)
  153. {
  154. m_pFrmTool = pFrameTool;
  155. m_pDataBaseOper = pDB;
  156. }
  157. void SetElectricEqpmtMap(ELEEQPMTMAP Elceqpmtmap)
  158. {
  159. ElectricEqpmtMap = Elceqpmtmap;
  160. }
  161. ELEEQPMTMAP* getElectricEqpmtMap()
  162. {
  163. return &ElectricEqpmtMap;
  164. }
  165. void SetPowerValueUpdateEqpmt(ELEEQPMTMAP *Elceqpmtmap); //设置需要更新电气参数的设备
  166. void SendIniCmd();
  167. //IBP接收事件
  168. void 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=0 );
  169. };