YN_NodeDef.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. #pragma once
  2. #ifndef ElectricKernelCalculate_YN_Node_Define_FILE
  3. #define ElectricKernelCalculate_YN_Node_Define_FILE
  4. #define double_Zero_Offszie 0.000001 //入岔区间的偏移值
  5. #define R_Rate_ContactLine 0.000028 //接触线的电阻率
  6. #define R_Rate_RailWay 0.0000137 //轨道的电阻率
  7. #define R_Rate_FeedBack 0.0000213 //馈线的电阻率
  8. #define R_Rate_RailToEarth 100000 //轨道到地的电阻率
  9. #define Max_NodeRelationNums 5 //最大节点关系数目
  10. #include <vector>
  11. #include <map>
  12. #include <mutex>
  13. using namespace std;
  14. class DcYNodeBase//直流节点类
  15. {
  16. public:
  17. typedef std::map<int, DcYNodeBase*> DcNodeMap;
  18. typedef std::map<int, double> DcRelaNodeMap;
  19. DcYNodeBase();;
  20. virtual ~DcYNodeBase();;
  21. virtual double GetSelfYValue();;
  22. virtual double GetRelaNodeYValue(int RelationNodeID);;
  23. virtual int GetRelaNodeRectIndex(int RelationNodeID);;
  24. void SetDcNodeMap(DcNodeMap* pNodeMap, std::mutex* pCritilSec);
  25. void SetNodeID(int ID);
  26. int GetNodeID();
  27. void SetRectIndex(int index);
  28. int GetRectIndex();
  29. int GetNodeCategory();
  30. void UpdateRelaNode(int oldid, int newid, double r);
  31. protected:
  32. int m_NodeID;
  33. int m_RectIndex; //矩阵索引
  34. int m_NodeCategory; //节点类型
  35. std::vector <int> m_v;
  36. DcRelaNodeMap m_RelaNodeRsMap; //关系节点
  37. DcNodeMap* p_DcYNodesMap; //直流侧节点
  38. std::mutex m_CritilSecRelaNodesMap;
  39. std::mutex* m_pCritilSecNodesMap;
  40. };
  41. class YN_RectierToTouchNet : public DcYNodeBase //整流器到接触网
  42. {
  43. public:
  44. YN_RectierToTouchNet();;
  45. virtual ~YN_RectierToTouchNet();;
  46. void SetStationID(int id);
  47. int GetStationID();
  48. bool SetTouchLineLen(double lenUpPre, double lenDownPre, double lenUpNext, double lenDownNext);
  49. bool SetUpPreNode(int id, double len);
  50. bool SetDownPreNode(int id, double len);
  51. bool SetUpNextNode(int id, double len);
  52. bool SetDownNextNode(int id, double len);
  53. void SetInnerNode(int id, double r);
  54. int GetUpPreNodeID();
  55. int GetDownPreNodeID();
  56. int GetUpNextNodeID();
  57. int GetDownNextNodeID();
  58. int GetInnerNodeID();
  59. double GetUpPreNodeLen();
  60. double GetDownPreNodeLen();
  61. double GetUpNextNodeLen();
  62. double GetDownNextNodeLen();
  63. protected:
  64. double Len_UpPreLine;
  65. double Len_DownPreLine;
  66. double Len_UpNextLine;
  67. double Len_DownNextLine;
  68. double Len_UpPreNode;
  69. double Len_DownPreNode;
  70. double Len_UpNextNode;
  71. double Len_DownNextNode;
  72. int UpPreNodeID;
  73. int DownPreNodeID;
  74. int UpNextNodeID;
  75. int DownNextNodeID;
  76. int InnerNodeID;
  77. int StationID;
  78. private:
  79. };
  80. class YN_RectierToRailway : public DcYNodeBase// 整流器轨道节点类
  81. {
  82. public:
  83. YN_RectierToRailway();;
  84. virtual ~YN_RectierToRailway();;
  85. void SetStationID(int id);
  86. int GetStationID();
  87. bool SetFeedBackLineLen(double lenPre, double lenNext);
  88. bool SetUpNode(int id, double len);
  89. bool SetDownNode(int id, double len);
  90. void SetInnerNode(int id, double r);
  91. int GetDownNode();
  92. int GetUpNode();
  93. protected:
  94. double Len_PreFeedBackLine; //前一节点回流线的长度
  95. double Len_NextFeedBackLine; //下一节点回流线的长度
  96. int UpNodeID; //上行节点ID
  97. int DownNodeID; //下行节点ID
  98. int InnerNodeID; //内节点ID
  99. int StationID; //车站ID
  100. private:
  101. };
  102. class YN_Railway : public DcYNodeBase//轨道节点类
  103. {
  104. public:
  105. YN_Railway();;
  106. virtual ~YN_Railway();;
  107. void SetStationID(int id);
  108. int GetStationID();
  109. virtual double GetSelfYValue();;
  110. bool SetFeedBackLineLen(double len);
  111. bool SetPreNode(int id, double len);
  112. bool SetNextNode(int id, double len);
  113. bool SetRectierNode(int id, double len);
  114. protected:
  115. double Len_RectierFeedBackLine; //整流器回流线的长度
  116. double PreY; //前一个导纳值
  117. double NextY; //下一个导纳值
  118. int PreNodeID; //前一个节点ID
  119. int NextNodeID; //下一个节点ID
  120. int RectierNodeID; //整流器节点ID
  121. int StationID;
  122. private:
  123. };
  124. class YN_HeadTail : public DcYNodeBase//头尾节点类
  125. {
  126. public:
  127. YN_HeadTail();;
  128. virtual ~YN_HeadTail();;
  129. virtual double GetSelfYValue();
  130. bool SetUpNode(int id, double len);
  131. bool SetDownNode(int id, double len);
  132. protected:
  133. double DownY; //下行导纳值
  134. int UpNodeID; //上行节点ID
  135. int DowntNodeID; //下行节点ID
  136. private:
  137. };
  138. class YN_TrianOnLine : public DcYNodeBase//列车与接触网的节点类
  139. {
  140. public:
  141. YN_TrianOnLine();;
  142. virtual ~YN_TrianOnLine();;
  143. bool SetPreNode(int id, double len);
  144. bool SetNextNode(int id, double len);
  145. void SetRailwayNode(int id);
  146. int GetPreNodeID();
  147. int GetNextNodeID();
  148. int GetRailwayNodeID();
  149. protected:
  150. int PreNodeID;
  151. int NextNodeID;
  152. int RailwayNodeID;
  153. private:
  154. };
  155. class YN_TrianOnRailway : public DcYNodeBase//列车与轨道的节点类
  156. {
  157. public:
  158. YN_TrianOnRailway();;
  159. virtual ~YN_TrianOnRailway();;
  160. bool SetPreNode(int id, double len);
  161. bool SetNextNode(int id, double len);
  162. void SetOnlineNode(int id);
  163. protected:
  164. double YPre;
  165. double YNext;
  166. int PreNodeID;
  167. int NextNodeID;
  168. int OnlineNodeID; //列车与接触网ID
  169. private:
  170. };
  171. typedef struct tgRelaNode //关系节点
  172. {
  173. double R; //电阻
  174. int NodeID; //节点ID
  175. bool m_IsPower; //关系节点的带电状态 xyx新增
  176. }RELANODE, * LPRELANODE;
  177. typedef struct tgPowerNodeBase //电力计算节点类
  178. {
  179. int m_NodeID; //节点ID
  180. int m_RectIndex; //矩阵索引
  181. int m_NodeCategory; //节点类型
  182. bool m_IsPower; //节点自身带电状态 xyx新增
  183. RELANODE RelaNodes[Max_NodeRelationNums]; //关系节点
  184. int RelationCount; //关系节点个数
  185. void Init(int rectindex, int id, int ncategory);
  186. double GetRelaNodeYValue(int RelationNodeID);;
  187. int GetRectIndex();;
  188. void UpdateRelaNode(int oldid, int newid, double r, bool power);
  189. int GetNodeCategory();
  190. void SetPower(bool power);
  191. bool GetPower();
  192. }POWERNODEBASE, * LPPOWERNODEBASE;//电力节点
  193. typedef struct tgRectierToTouchNet : tgPowerNodeBase//整流器接触网节点类
  194. {
  195. double Len_UpPreLine;//上行线前一段线的长度
  196. double Len_DownPreLine;//下行
  197. double Len_UpNextLine;//下一段
  198. double Len_DownNextLine;
  199. double Len_UpPreNode;
  200. double Len_DownPreNode;
  201. double Len_UpNextNode;
  202. double Len_DownNextNode;
  203. int UpPreNodeID;
  204. int DownPreNodeID;
  205. int UpNextNodeID;
  206. int DownNextNodeID;
  207. int InnerNodeID;
  208. int StationID;
  209. void UpdateRelaNodeByIndex(int index, int newid, double r, bool power);
  210. double GetSelfYValue();;
  211. bool SetTouchLineLen(double lenUpPre, double lenDownPre, double lenUpNext, double lenDownNext);
  212. bool SetUpPreNode(int id, double len, bool power);
  213. bool SetDownPreNode(int id, double len, bool power);
  214. bool SetUpNextNode(int id, double len, bool power);
  215. bool SetDownNextNode(int id, double len, bool power);
  216. void SetInnerNode(int id, double r, bool power);
  217. int GetUpPreNodeID();
  218. int GetDownPreNodeID();
  219. int GetUpNextNodeID();
  220. int GetDownNextNodeID();
  221. int GetInnerNodeID();
  222. double GetUpPreNodeLen();
  223. double GetDownPreNodeLen();
  224. double GetUpNextNodeLen();
  225. double GetDownNextNodeLen();
  226. }RECTIERTOTOUCHNET, * LPRECTIERTOTOUCHNET;
  227. typedef struct tgRectierToRailway : tgPowerNodeBase //整流器轨道电路节点类
  228. {
  229. double Len_PreFeedBackLine;//前段馈线长度 //上行回流线长度 xyx注释
  230. double Len_NextFeedBackLine;//下段馈线长度 //下行回流线长度 xyx注释
  231. int UpNodeID;
  232. int DownNodeID;
  233. int InnerNodeID;
  234. int StationID;
  235. double GetSelfYValue();;
  236. void SetStationID(int id);
  237. int GetStationID();
  238. bool SetFeedBackLineLen(double lenPre, double lenNext);
  239. bool SetUpNode(int id, double len, bool power);
  240. bool SetDownNode(int id, double len, bool power);
  241. void SetInnerNode(int id, double r, bool power);
  242. int GetDownNode();
  243. int GetUpNode();
  244. }RECTIERTORAILWAY, * LPRECTIERTORAILWAY;
  245. typedef struct tgRailway : tgPowerNodeBase//轨道节点类,继承于tgPowerNodeBase结构体
  246. {
  247. double Len_FeBackLine;
  248. double PreY; //当前轨道节点前侧(左侧)对地导纳 xyx注释
  249. double NextY; //当前轨道节点后侧(右侧)对地导纳 xyx注释
  250. int PreNodeID;
  251. int NextNodeID;
  252. int RectierNodeID; //与当前轨道节点相关联的节点 xyx注释
  253. int StationID;
  254. double GetSelfYValue();;
  255. void SetStationID(int id);
  256. int GetStationID();
  257. bool SetFeedBackLineLen(double len);
  258. bool SetPreNode(int id, double len, bool power);
  259. bool SetNextNode(int id, double len, bool power);
  260. bool SetRectierNode(int id, double len, bool power);
  261. }RAILWAY, * LPRAILWAY;
  262. typedef struct tgHeadTail : tgPowerNodeBase //头尾节点类
  263. {
  264. double DownY;
  265. int DowntNodeID;
  266. double GetSelfYValue();;
  267. /*bool SetUpNode(int id,double len)
  268. {
  269. if (len<=0)
  270. {
  271. return false;
  272. }
  273. double r = len*R_Rate_ContactLine;
  274. UpdateRelaNode(UpNodeID,id,r);
  275. UpNodeID =id;
  276. return true;
  277. }*/
  278. bool SetDownNode(int id, double len, bool power);
  279. }HEADTAIL, * LPHEADTAIL;
  280. typedef struct tgTRIANONLINE : tgPowerNodeBase //列车与接触网线的节点类 //当前列车的受电弓节点 xyx注释
  281. {
  282. int PreNodeID;//前一节点ID
  283. int NextNodeID;//下一节点ID
  284. int RailwayNodeID;//轨道节点ID //当前列车:与受电弓节点对应的轮对节点 xyx注释
  285. int TrianNO;//列车编号
  286. int LineSectionNo;//线路区域编号
  287. double excursion;//偏移精度
  288. int arrow;//方向
  289. double PowerRate;//功率
  290. double GetSelfYValue();;
  291. bool SetPreNode(int id, double len, bool power);
  292. bool SetNextNode(int id, double len, bool power);
  293. void SetTrianInfo(int no, int lineno, double ex, int arrow);
  294. void SetRailwayNode(int id);
  295. int GetPreNodeID();
  296. int GetNextNodeID();
  297. int GetRailwayNodeID();
  298. }TRIANONLINE, * LPTRIANONLINE;
  299. typedef struct tgTrianOnRailway : tgPowerNodeBase //列车与轨道的节点类
  300. {
  301. double YPre;
  302. double YNext;
  303. int PreNodeID;
  304. int NextNodeID;
  305. int OnlineNodeID;
  306. double PowerRate;
  307. double GetSelfYValue();;
  308. bool SetPreNode(int id, double len, bool power);
  309. bool SetNextNode(int id, double len, bool power);
  310. void SetOnlineNode(int id);
  311. int GetOnlineNodeID();
  312. }TRIANONRAILWAY, * LPTRIANONRAILWAY;//列车在轨道上
  313. typedef struct tgPowerNode //电力节点 //OCC交互数据表使用的结构???????????
  314. {
  315. enum class NodeType {
  316. eDc_NodeKind_Unknow = 0,
  317. eDc_NodeKind_HeadTail = 1,
  318. eDc_NodeKind_RectierToTouchNet = 2, //新定义命令
  319. eDc_NodeKind_RectierToRailWay = 3, //设备状态更新
  320. eDc_NodeKind_RailWay = 4,
  321. eDc_NodeKind_UpTrain = 5, //新定义命令
  322. eDc_NodeKind_DownTrain = 6, //设备状态更新
  323. };
  324. NodeType nodeType; //节点类型
  325. int NodeID; //节点ID
  326. double m_NodeV; //节点电压
  327. union
  328. {
  329. RECTIERTOTOUCHNET RectierToTouchNetNode; //整流器到接触网节点
  330. RECTIERTORAILWAY RectierToRailwayNode; //整流器到轨道节点
  331. RAILWAY RailWayNode; //轨道节点
  332. HEADTAIL HeadTailNode; //头尾节点
  333. TRIANONLINE TrianOnLineNode; //列车与接触网节点
  334. TRIANONRAILWAY TrianOnRailway; //列车与轨道节点
  335. };
  336. tgPowerNode();
  337. int GetRectIndex();
  338. void setRectierToTouchNet(const RECTIERTOTOUCHNET* paraNode);
  339. void setRectierToRailway(const RECTIERTORAILWAY* paraNode);
  340. void setRailway(const RAILWAY* paraNode);
  341. void setHeadTail(const HEADTAIL* paraNode);
  342. void setTrianOnLine(const TRIANONLINE* paraNode);
  343. void setTrianOnRailway(const TRIANONRAILWAY* paraNode);
  344. }POWERNODE, * LPPOWERNODE;
  345. #endif