#pragma once #ifndef ElectricKernelCalculate_YN_Node_Define_FILE #define ElectricKernelCalculate_YN_Node_Define_FILE #define double_Zero_Offszie 0.000001 //入岔区间的偏移值 #define R_Rate_ContactLine 0.000028 //接触线的电阻率 #define R_Rate_RailWay 0.0000137 //轨道的电阻率 #define R_Rate_FeedBack 0.0000213 //馈线的电阻率 #define R_Rate_RailToEarth 100000 //轨道到地的电阻率 #define Max_NodeRelationNums 5 //最大节点关系数目 #include #include #include using namespace std; class DcYNodeBase//直流节点类 { public: typedef std::map DcNodeMap; typedef std::map DcRelaNodeMap; DcYNodeBase();; virtual ~DcYNodeBase();; virtual double GetSelfYValue();; virtual double GetRelaNodeYValue(int RelationNodeID);; virtual int GetRelaNodeRectIndex(int RelationNodeID);; void SetDcNodeMap(DcNodeMap* pNodeMap, std::mutex* pCritilSec); void SetNodeID(int ID); int GetNodeID(); void SetRectIndex(int index); int GetRectIndex(); int GetNodeCategory(); void UpdateRelaNode(int oldid, int newid, double r); protected: int m_NodeID; int m_RectIndex; //矩阵索引 int m_NodeCategory; //节点类型 std::vector m_v; DcRelaNodeMap m_RelaNodeRsMap; //关系节点 DcNodeMap* p_DcYNodesMap; //直流侧节点 std::mutex m_CritilSecRelaNodesMap; std::mutex* m_pCritilSecNodesMap; }; class YN_RectierToTouchNet : public DcYNodeBase //整流器到接触网 { public: YN_RectierToTouchNet();; virtual ~YN_RectierToTouchNet();; void SetStationID(int id); int GetStationID(); bool SetTouchLineLen(double lenUpPre, double lenDownPre, double lenUpNext, double lenDownNext); bool SetUpPreNode(int id, double len); bool SetDownPreNode(int id, double len); bool SetUpNextNode(int id, double len); bool SetDownNextNode(int id, double len); void SetInnerNode(int id, double r); int GetUpPreNodeID(); int GetDownPreNodeID(); int GetUpNextNodeID(); int GetDownNextNodeID(); int GetInnerNodeID(); double GetUpPreNodeLen(); double GetDownPreNodeLen(); double GetUpNextNodeLen(); double GetDownNextNodeLen(); protected: double Len_UpPreLine; double Len_DownPreLine; double Len_UpNextLine; double Len_DownNextLine; double Len_UpPreNode; double Len_DownPreNode; double Len_UpNextNode; double Len_DownNextNode; int UpPreNodeID; int DownPreNodeID; int UpNextNodeID; int DownNextNodeID; int InnerNodeID; int StationID; private: }; class YN_RectierToRailway : public DcYNodeBase// 整流器轨道节点类 { public: YN_RectierToRailway();; virtual ~YN_RectierToRailway();; void SetStationID(int id); int GetStationID(); bool SetFeedBackLineLen(double lenPre, double lenNext); bool SetUpNode(int id, double len); bool SetDownNode(int id, double len); void SetInnerNode(int id, double r); int GetDownNode(); int GetUpNode(); protected: double Len_PreFeedBackLine; //前一节点回流线的长度 double Len_NextFeedBackLine; //下一节点回流线的长度 int UpNodeID; //上行节点ID int DownNodeID; //下行节点ID int InnerNodeID; //内节点ID int StationID; //车站ID private: }; class YN_Railway : public DcYNodeBase//轨道节点类 { public: YN_Railway();; virtual ~YN_Railway();; void SetStationID(int id); int GetStationID(); virtual double GetSelfYValue();; bool SetFeedBackLineLen(double len); bool SetPreNode(int id, double len); bool SetNextNode(int id, double len); bool SetRectierNode(int id, double len); protected: double Len_RectierFeedBackLine; //整流器回流线的长度 double PreY; //前一个导纳值 double NextY; //下一个导纳值 int PreNodeID; //前一个节点ID int NextNodeID; //下一个节点ID int RectierNodeID; //整流器节点ID int StationID; private: }; class YN_HeadTail : public DcYNodeBase//头尾节点类 { public: YN_HeadTail();; virtual ~YN_HeadTail();; virtual double GetSelfYValue(); bool SetUpNode(int id, double len); bool SetDownNode(int id, double len); protected: double DownY; //下行导纳值 int UpNodeID; //上行节点ID int DowntNodeID; //下行节点ID private: }; class YN_TrianOnLine : public DcYNodeBase//列车与接触网的节点类 { public: YN_TrianOnLine();; virtual ~YN_TrianOnLine();; bool SetPreNode(int id, double len); bool SetNextNode(int id, double len); void SetRailwayNode(int id); int GetPreNodeID(); int GetNextNodeID(); int GetRailwayNodeID(); protected: int PreNodeID; int NextNodeID; int RailwayNodeID; private: }; class YN_TrianOnRailway : public DcYNodeBase//列车与轨道的节点类 { public: YN_TrianOnRailway();; virtual ~YN_TrianOnRailway();; bool SetPreNode(int id, double len); bool SetNextNode(int id, double len); void SetOnlineNode(int id); protected: double YPre; double YNext; int PreNodeID; int NextNodeID; int OnlineNodeID; //列车与接触网ID private: }; typedef struct tgRelaNode //关系节点 { double R; //电阻 int NodeID; //节点ID bool m_IsPower; //关系节点的带电状态 xyx新增 }RELANODE, * LPRELANODE; typedef struct tgPowerNodeBase //电力计算节点类 { int m_NodeID; //节点ID int m_RectIndex; //矩阵索引 int m_NodeCategory; //节点类型 bool m_IsPower; //节点自身带电状态 xyx新增 RELANODE RelaNodes[Max_NodeRelationNums]; //关系节点 int RelationCount; //关系节点个数 void Init(int rectindex, int id, int ncategory); double GetRelaNodeYValue(int RelationNodeID);; int GetRectIndex();; void UpdateRelaNode(int oldid, int newid, double r, bool power); int GetNodeCategory(); void SetPower(bool power); bool GetPower(); }POWERNODEBASE, * LPPOWERNODEBASE;//电力节点 typedef struct tgRectierToTouchNet : tgPowerNodeBase//整流器接触网节点类 { double Len_UpPreLine;//上行线前一段线的长度 double Len_DownPreLine;//下行 double Len_UpNextLine;//下一段 double Len_DownNextLine; double Len_UpPreNode; double Len_DownPreNode; double Len_UpNextNode; double Len_DownNextNode; int UpPreNodeID; int DownPreNodeID; int UpNextNodeID; int DownNextNodeID; int InnerNodeID; int StationID; void UpdateRelaNodeByIndex(int index, int newid, double r, bool power); double GetSelfYValue();; bool SetTouchLineLen(double lenUpPre, double lenDownPre, double lenUpNext, double lenDownNext); bool SetUpPreNode(int id, double len, bool power); bool SetDownPreNode(int id, double len, bool power); bool SetUpNextNode(int id, double len, bool power); bool SetDownNextNode(int id, double len, bool power); void SetInnerNode(int id, double r, bool power); int GetUpPreNodeID(); int GetDownPreNodeID(); int GetUpNextNodeID(); int GetDownNextNodeID(); int GetInnerNodeID(); double GetUpPreNodeLen(); double GetDownPreNodeLen(); double GetUpNextNodeLen(); double GetDownNextNodeLen(); }RECTIERTOTOUCHNET, * LPRECTIERTOTOUCHNET; typedef struct tgRectierToRailway : tgPowerNodeBase //整流器轨道电路节点类 { double Len_PreFeedBackLine;//前段馈线长度 //上行回流线长度 xyx注释 double Len_NextFeedBackLine;//下段馈线长度 //下行回流线长度 xyx注释 int UpNodeID; int DownNodeID; int InnerNodeID; int StationID; double GetSelfYValue();; void SetStationID(int id); int GetStationID(); bool SetFeedBackLineLen(double lenPre, double lenNext); bool SetUpNode(int id, double len, bool power); bool SetDownNode(int id, double len, bool power); void SetInnerNode(int id, double r, bool power); int GetDownNode(); int GetUpNode(); }RECTIERTORAILWAY, * LPRECTIERTORAILWAY; typedef struct tgRailway : tgPowerNodeBase//轨道节点类,继承于tgPowerNodeBase结构体 { double Len_FeBackLine; double PreY; //当前轨道节点前侧(左侧)对地导纳 xyx注释 double NextY; //当前轨道节点后侧(右侧)对地导纳 xyx注释 int PreNodeID; int NextNodeID; int RectierNodeID; //与当前轨道节点相关联的节点 xyx注释 int StationID; double GetSelfYValue();; void SetStationID(int id); int GetStationID(); bool SetFeedBackLineLen(double len); bool SetPreNode(int id, double len, bool power); bool SetNextNode(int id, double len, bool power); bool SetRectierNode(int id, double len, bool power); }RAILWAY, * LPRAILWAY; typedef struct tgHeadTail : tgPowerNodeBase //头尾节点类 { double DownY; int DowntNodeID; double GetSelfYValue();; /*bool SetUpNode(int id,double len) { if (len<=0) { return false; } double r = len*R_Rate_ContactLine; UpdateRelaNode(UpNodeID,id,r); UpNodeID =id; return true; }*/ bool SetDownNode(int id, double len, bool power); }HEADTAIL, * LPHEADTAIL; typedef struct tgTRIANONLINE : tgPowerNodeBase //列车与接触网线的节点类 //当前列车的受电弓节点 xyx注释 { int PreNodeID;//前一节点ID int NextNodeID;//下一节点ID int RailwayNodeID;//轨道节点ID //当前列车:与受电弓节点对应的轮对节点 xyx注释 int TrianNO;//列车编号 int LineSectionNo;//线路区域编号 double excursion;//偏移精度 int arrow;//方向 double PowerRate;//功率 double GetSelfYValue();; bool SetPreNode(int id, double len, bool power); bool SetNextNode(int id, double len, bool power); void SetTrianInfo(int no, int lineno, double ex, int arrow); void SetRailwayNode(int id); int GetPreNodeID(); int GetNextNodeID(); int GetRailwayNodeID(); }TRIANONLINE, * LPTRIANONLINE; typedef struct tgTrianOnRailway : tgPowerNodeBase //列车与轨道的节点类 { double YPre; double YNext; int PreNodeID; int NextNodeID; int OnlineNodeID; double PowerRate; double GetSelfYValue();; bool SetPreNode(int id, double len, bool power); bool SetNextNode(int id, double len, bool power); void SetOnlineNode(int id); int GetOnlineNodeID(); }TRIANONRAILWAY, * LPTRIANONRAILWAY;//列车在轨道上 typedef struct tgPowerNode //电力节点 //OCC交互数据表使用的结构??????????? { enum class NodeType { eDc_NodeKind_Unknow = 0, eDc_NodeKind_HeadTail = 1, eDc_NodeKind_RectierToTouchNet = 2, //新定义命令 eDc_NodeKind_RectierToRailWay = 3, //设备状态更新 eDc_NodeKind_RailWay = 4, eDc_NodeKind_UpTrain = 5, //新定义命令 eDc_NodeKind_DownTrain = 6, //设备状态更新 }; NodeType nodeType; //节点类型 int NodeID; //节点ID double m_NodeV; //节点电压 union { RECTIERTOTOUCHNET RectierToTouchNetNode; //整流器到接触网节点 RECTIERTORAILWAY RectierToRailwayNode; //整流器到轨道节点 RAILWAY RailWayNode; //轨道节点 HEADTAIL HeadTailNode; //头尾节点 TRIANONLINE TrianOnLineNode; //列车与接触网节点 TRIANONRAILWAY TrianOnRailway; //列车与轨道节点 }; tgPowerNode(); int GetRectIndex(); void setRectierToTouchNet(const RECTIERTOTOUCHNET* paraNode); void setRectierToRailway(const RECTIERTORAILWAY* paraNode); void setRailway(const RAILWAY* paraNode); void setHeadTail(const HEADTAIL* paraNode); void setTrianOnLine(const TRIANONLINE* paraNode); void setTrianOnRailway(const TRIANONRAILWAY* paraNode); }POWERNODE, * LPPOWERNODE; #endif