ACSysMG.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. #include "pch.h"
  2. #include "ACSysMG.h"
  3. #include <math.h>
  4. #include <chrono>
  5. #include <ctime>
  6. #include <sstream>
  7. #include <iomanip>
  8. void ACSysMG::SetPQValueArr(DCNodePQValue PQValueArr[]) //设置PQ矩阵数组
  9. {
  10. p_PQValueArr=PQValueArr;
  11. }
  12. ACSysMG::ACSysMG(void)
  13. {
  14. p_PQValueArr=nullptr;
  15. m_nMaxSigleArrowTrainNums = Max_SigleArrowTrain_Nums;
  16. m_nAllPowerStationNums = All_Power_Station_Nums;
  17. ACNodeMatrix=new RX *[m_nMaxSigleArrowTrainNums];
  18. for (int i=0;i< m_nMaxSigleArrowTrainNums;i++)
  19. {
  20. ACNodeMatrix[i]=new RX[m_nMaxSigleArrowTrainNums];
  21. }
  22. E=new double[m_nMaxSigleArrowTrainNums];
  23. F=new double[m_nMaxSigleArrowTrainNums];
  24. P=new double[m_nMaxSigleArrowTrainNums];
  25. Q=new double[m_nMaxSigleArrowTrainNums];
  26. m_pElectricEqpmtMap=nullptr;
  27. }
  28. void ACSysMG::UpdataTrainData(DCSysTrain* pTrain)
  29. {
  30. }
  31. ACSysMG::~ACSysMG(void)
  32. {
  33. m_CritilSecEqpmt.lock();
  34. if (ACNodeMatrix!=nullptr)
  35. {
  36. for (int i=0;i< m_nMaxSigleArrowTrainNums;i++)
  37. {
  38. if(ACNodeMatrix[i]==nullptr)
  39. {
  40. continue;
  41. }
  42. delete[] ACNodeMatrix[i];
  43. ACNodeMatrix[i]=nullptr;
  44. }
  45. delete[] ACNodeMatrix;
  46. ACNodeMatrix=nullptr;
  47. }
  48. delete[] E;
  49. E=nullptr;
  50. delete[] F;
  51. F=nullptr;
  52. delete[] P;
  53. P=nullptr;
  54. delete[] Q;
  55. Q=nullptr;
  56. // for (EqpmtMap::iterator iterd=m_EqpmtInfoMap.begin();iterd!=m_EqpmtInfoMap.end();iterd++)
  57. // {
  58. // if (iterd->second!=nullptr)
  59. // {
  60. // delete iterd->second;
  61. // iterd->second=nullptr;
  62. // }
  63. // }
  64. // m_EqpmtInfoMap.clear();
  65. m_CritilSecEqpmt.unlock();
  66. }
  67. bool ACSysMG::AddPQNodeData(CalNode& node) //增加PQ节点数据
  68. {
  69. if (node.ID>=0)
  70. {
  71. m_PQNodes.push_back(node);
  72. return true;
  73. }
  74. return false;
  75. }
  76. bool ACSysMG::AddEqpmtData(EqpmtInfo* pEqpmt) //增加设备数据(ID,状态,种类,ID名字)
  77. {
  78. if (pEqpmt!=nullptr)
  79. {
  80. m_CritilSecEqpmt.lock();
  81. m_EqpmtInfoMap.insert(make_pair(pEqpmt->GetID(),pEqpmt));//向设备信息表中增加设备的信息
  82. m_CritilSecEqpmt.unlock();
  83. return true;
  84. }
  85. return false;
  86. }
  87. double ACSysMG::CalQiValue(int i) //计算第i个节点的无功功率值,
  88. {
  89. double sume=0;
  90. double sumf=0;
  91. if (i< m_nMaxSigleArrowTrainNums &&i<m_PQNodes.size())
  92. {
  93. for (int k=0;k<m_PQNodes.size();k++)
  94. {
  95. //ACNodeMatrix 交流侧节点矩阵
  96. sume+=(ACNodeMatrix[i][k].R*E[k]-ACNodeMatrix[i][k].X*F[k]);////Qi值的实部计算,P25,公式(3-41)
  97. sumf+=(ACNodeMatrix[i][k].R*F[k]+ACNodeMatrix[i][k].X*E[k]);//Qi值的虚部计算,P25,公式(3-41)
  98. }
  99. }
  100. return F[i]*sume-E[i]*sumf;
  101. }
  102. bool ACSysMG::CalYKBMatriX() //计算雅可比矩阵在进行求解时误差判断,是否小于迭代精度,如不满足给出的迭代精度,则需一直迭代计算////
  103. {
  104. m_EquationCalcul.jisuan();
  105. if (!m_EquationCalcul.CheckResult())
  106. {
  107. return false;
  108. }
  109. bool Stop=true;
  110. int ntest=m_PQNodes.size()-1;
  111. for(int n=0; n <ntest ; n++)
  112. {
  113. if (n>111)
  114. {
  115. int xyx=1;
  116. }
  117. int row = 2*n;
  118. int colom = m_EquationCalcul.lie-1;
  119. double bvalue = m_EquationCalcul.b[2*n][m_EquationCalcul.lie-1];
  120. double err = EF_Calculate_Offsize;
  121. if ((m_EquationCalcul.b[2*n][m_EquationCalcul.lie-1]>EF_Calculate_Offsize)||(m_EquationCalcul.b[2*n][m_EquationCalcul.lie-1]<-EF_Calculate_Offsize)) //偶数行
  122. {//用于计算F[n] //#define EF_Calculate_Offsize 0.001//?计算时间偏移差
  123. Stop=false;
  124. }
  125. int row2 = 2*n+1;
  126. int colom2 = m_EquationCalcul.lie-1;
  127. double bvalue2 = m_EquationCalcul.b[2*n+1][m_EquationCalcul.lie-1];
  128. if ((m_EquationCalcul.b[2*n+1][m_EquationCalcul.lie-1]>EF_Calculate_Offsize)||(m_EquationCalcul.b[2*n+1][m_EquationCalcul.lie-1]<-EF_Calculate_Offsize)) //奇数行
  129. {//用于计算E[n]
  130. Stop=false;
  131. }
  132. double c=F[n+1]-m_EquationCalcul.b[2*n][m_EquationCalcul.lie-1];
  133. double d=E[n+1]-m_EquationCalcul.b[2*n+1][m_EquationCalcul.lie-1];
  134. F[n+1]=F[n+1]-m_EquationCalcul.b[2*n][m_EquationCalcul.lie-1]; //系统功率偏差向量的迭代,P27,公式(3-37)
  135. E[n+1]=E[n+1]-m_EquationCalcul.b[2*n+1][m_EquationCalcul.lie-1];
  136. }
  137. //TRACE("E0%f,f0%f\n",E[0],F[0]);
  138. //TRACE("E1%f,f1%f\n",E[1],F[1]);
  139. return Stop;
  140. }
  141. void ACSysMG::CalResult( ) //计算节点的电压,功率,电流;计算消耗功率的有功功率的输入输出电流,无功功率的输入输出电流
  142. {
  143. m_CritilSecEqpmt.lock();
  144. for(int n=1;n<m_PQNodes.size();n++)
  145. {
  146. F[n] =m_PQNodes[n].F;
  147. E[n] = m_PQNodes[n].E;
  148. double a = sqrt(F[n]*F[n]+E[n]*E[n]); //E[n],F[n],第n个节点的电压的实部与虚部
  149. //测试
  150. if ( n>106)
  151. {
  152. double x=E[n];
  153. double y=a*35000;
  154. int yur=1;
  155. }
  156. double e=E[n];
  157. double b=a*35000;
  158. m_PQNodes[n].OutputV=a; //节点电压的计算
  159. //与节点关联的馈线m_SubLines电流值的计算
  160. for (int e=0;e<m_PQNodes[n].m_SubLines.size();e++) //节点所关联的馈线相关电气量计算 xyx注释
  161. {
  162. double p =m_PQNodes[n].m_SubLines[e].P/Sac; //第n个节点的功率的实部。。(公式(3-31))。。。。Sac为交流侧容量基准值(通过此公式计算有功功率的标幺值)
  163. double q = m_PQNodes[n].m_SubLines[e].Q/Sac; //第n个节点的功率的虚部(公式(3-31)
  164. double s= sqrt(p*p+q*q); //第n个节点功率的计算,此处的n为任意数
  165. m_PQNodes[n].m_SubLines[e].I=(s/m_PQNodes[n].OutputV)*Iac; //第n个节点的电流计算(P=UI)
  166. }
  167. //xyx新增 begin
  168. //(1)将母线节点电压计算结果赋给相应的母线图元设备
  169. if (m_pElectricEqpmtMap!=nullptr)
  170. {
  171. ELEEQPMTMAP::iterator iterBusEqpmt=m_pElectricEqpmtMap->find(m_PQNodes[n].BgkID);
  172. if (iterBusEqpmt!=m_pElectricEqpmtMap->end())
  173. {
  174. if (iterBusEqpmt->second->GetPower())
  175. {
  176. iterBusEqpmt->second->m_EqpmtPowerValue.U = m_PQNodes[n].OutputV* Vac/1000; //Vac为交流侧电压基准值
  177. iterBusEqpmt->second->m_EqpmtPowerValue.Uab = m_PQNodes[n].OutputV* Vac/1000;
  178. iterBusEqpmt->second->m_EqpmtPowerValue.Ubc = m_PQNodes[n].OutputV* Vac/1000;
  179. iterBusEqpmt->second->m_EqpmtPowerValue.Uca = m_PQNodes[n].OutputV* Vac/1000;
  180. iterBusEqpmt->second->m_EqpmtPowerValue.Ua = m_PQNodes[n].OutputV* Vac/sqrt(3.0)/1000;
  181. iterBusEqpmt->second->m_EqpmtPowerValue.Ub = m_PQNodes[n].OutputV* Vac/sqrt(3.0)/1000;
  182. iterBusEqpmt->second->m_EqpmtPowerValue.Uc = m_PQNodes[n].OutputV* Vac/sqrt(3.0)/1000;
  183. //若为400V母线节点
  184. //if(m_PQNodes[n].Category==PowerNode_PQL_Category)
  185. //{
  186. // double P= m_PQNodes[n].ConsumePowerR;
  187. // double Q= m_PQNodes[n].ConsumePowerX;
  188. // double i= sqrt(P*P+Q*Q)*Sac/(sqrt(3.0)*m_PQNodes[n].OutputV* Vac);
  189. //
  190. // iterBusEqpmt->second->m_EqpmtPowerValue.Ia = i/sqrt(3.0);
  191. // iterBusEqpmt->second->m_EqpmtPowerValue.Ib = i/sqrt(3.0);
  192. // iterBusEqpmt->second->m_EqpmtPowerValue.Ic = i/sqrt(3.0);
  193. // iterBusEqpmt->second->m_EqpmtPowerValue.P = P * Sac/1000;
  194. // iterBusEqpmt->second->m_EqpmtPowerValue.Q = Q * Sac/1000;
  195. // iterBusEqpmt->second->m_EqpmtPowerValue.PF = P/(sqrt(P*P+Q*Q));
  196. //}
  197. }
  198. else
  199. {
  200. iterBusEqpmt->second->m_EqpmtPowerValue.U = 0.0;
  201. iterBusEqpmt->second->m_EqpmtPowerValue.Uab = 0.0;
  202. iterBusEqpmt->second->m_EqpmtPowerValue.Ubc = 0.0;
  203. iterBusEqpmt->second->m_EqpmtPowerValue.Uca = 0.0;
  204. iterBusEqpmt->second->m_EqpmtPowerValue.Ua = 0.0;
  205. iterBusEqpmt->second->m_EqpmtPowerValue.Ub = 0.0;
  206. iterBusEqpmt->second->m_EqpmtPowerValue.Uc = 0.0;
  207. iterBusEqpmt->second->m_EqpmtPowerValue.I = 0.0;
  208. iterBusEqpmt->second->m_EqpmtPowerValue.Ia = 0.0;
  209. iterBusEqpmt->second->m_EqpmtPowerValue.Ib = 0.0;
  210. iterBusEqpmt->second->m_EqpmtPowerValue.Ic = 0.0;
  211. iterBusEqpmt->second->m_EqpmtPowerValue.P = 0.0;
  212. iterBusEqpmt->second->m_EqpmtPowerValue.Q = 0.0;
  213. iterBusEqpmt->second->m_EqpmtPowerValue.PF = 0.0;
  214. }
  215. iterBusEqpmt->second->m_EqpmtPowerValue.Position = m_PQNodes[n].Position;
  216. }
  217. //(2)为与当前节点关联的断路器开关赋值
  218. for(int k=0;k<m_PQNodes[n].m_RelationsSwitch.size();k++)
  219. {
  220. ELEEQPMTMAP::iterator iterSwitchEqpmt=m_pElectricEqpmtMap->find(m_PQNodes[n].m_RelationsSwitch[k]);
  221. if (iterSwitchEqpmt!=m_pElectricEqpmtMap->end())
  222. {
  223. if (iterSwitchEqpmt->second->GetEqpmentType()==Electric_EqpmentType_Breaker)
  224. {
  225. if (iterSwitchEqpmt->second->GetPower())
  226. {
  227. //开关的电压值
  228. double Switch_U = m_PQNodes[n].OutputV* Vac;
  229. iterSwitchEqpmt->second->m_EqpmtPowerValue.U = Switch_U/1000;
  230. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uab = Switch_U/1000;
  231. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ubc = Switch_U/1000;
  232. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uca = Switch_U/1000;
  233. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ua = Switch_U/(sqrt(3.0)*1000);
  234. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ub = Switch_U/(sqrt(3.0)*1000);
  235. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uc = Switch_U/(sqrt(3.0)*1000);
  236. //开关的电流值:通过支路与节点进行计算
  237. EqpmtMap::iterator iterLine = m_EqpmtInfoMap.begin();
  238. for (;iterLine!=m_EqpmtInfoMap.end();iterLine++)
  239. {
  240. PowerLine* pLine = (PowerLine*)iterLine->second;
  241. for (int m=0;m<m_PQNodes[n].m_Relations.size();m++)
  242. {
  243. if (iterLine->first==m_PQNodes[n].m_Relations[m])
  244. {
  245. //(1)若为35kV进出线
  246. if (iterLine->second->GetCateGory()==Eqpmt_Category_Powerline)
  247. {
  248. if(m_PQNodes[n].Category==PowerNode_PQ_Category||m_PQNodes[n].Category==PowerNode_PQD_Category)//若为35kV母线节点关联支路
  249. {
  250. if (pLine->GetLlineID()>=0&&pLine->GetLlineID()< m_nMaxSigleArrowTrainNums &&pLine->GetRlineID()>=0&&pLine->GetRlineID()< m_nMaxSigleArrowTrainNums)
  251. {
  252. //纯阻抗支路
  253. double Ir=(pLine->GetR()*(E[pLine->GetLlineID()]-E[pLine->GetRlineID()])+pLine->GetX()*(F[pLine->GetLlineID()]-F[pLine->GetRlineID()]))/(pLine->GetR()*pLine->GetR()+pLine->GetX()*pLine->GetX());
  254. double Ix=(pLine->GetR()*(F[pLine->GetLlineID()]-F[pLine->GetRlineID()])-pLine->GetX()*(E[pLine->GetLlineID()]-E[pLine->GetRlineID()]))/(pLine->GetR()*pLine->GetR()+pLine->GetX()*pLine->GetX());
  255. double i_TransLine= sqrt(Ix*Ix+Ir*Ir) * Iac;
  256. iterSwitchEqpmt->second->m_EqpmtPowerValue.I = i_TransLine;
  257. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ia = i_TransLine/sqrt(3.0);
  258. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ib = i_TransLine/sqrt(3.0);
  259. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ic = i_TransLine/sqrt(3.0);
  260. iterSwitchEqpmt->second->m_EqpmtPowerValue.P = i_TransLine*Switch_U*sqrt(3.0)/1000;
  261. }
  262. }
  263. }
  264. //(2)若为35kV动力变馈线
  265. else if (iterLine->second->GetCateGory()==Eqpmt_Category_Powerline_Transformer_35To400)
  266. {
  267. //负荷支路电流
  268. double i_Load= sqrt(m_PQNodes[n].ConsumePowerR*m_PQNodes[n].ConsumePowerR + m_PQNodes[n].ConsumePowerX*m_PQNodes[n].ConsumePowerX)/m_PQNodes[n].OutputV * Iac;
  269. if (m_PQNodes[n].Category==PowerNode_PQL_Category) //若为与400V母线关联的开关
  270. {
  271. iterSwitchEqpmt->second->m_EqpmtPowerValue.I = i_Load;
  272. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ia = i_Load/sqrt(3.0);
  273. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ib = i_Load/sqrt(3.0);
  274. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ic = i_Load/sqrt(3.0);
  275. iterSwitchEqpmt->second->m_EqpmtPowerValue.P = m_PQNodes[n].ConsumePowerR * Sac/1000;
  276. iterSwitchEqpmt->second->m_EqpmtPowerValue.Q = m_PQNodes[n].ConsumePowerX * Sac/1000;
  277. iterSwitchEqpmt->second->m_EqpmtPowerValue.S = sqrt(m_PQNodes[n].ConsumePowerR*m_PQNodes[n].ConsumePowerR + m_PQNodes[n].ConsumePowerX*m_PQNodes[n].ConsumePowerX) * Sac/1000;
  278. iterSwitchEqpmt->second->m_EqpmtPowerValue.PF = iterSwitchEqpmt->second->m_EqpmtPowerValue.P/iterSwitchEqpmt->second->m_EqpmtPowerValue.S;
  279. }
  280. else if(m_PQNodes[n].Category==PowerNode_PQ_Category||m_PQNodes[n].Category==PowerNode_PQD_Category) //若为与35kV母线关联的开关
  281. {
  282. iterSwitchEqpmt->second->m_EqpmtPowerValue.I = i_Load * 0.0114; //动力变压器变比N1:N2=1:K,其中K=0.0114
  283. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ia = i_Load * 0.0114/sqrt(3.0);
  284. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ib = i_Load * 0.0114/sqrt(3.0);
  285. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ic = i_Load * 0.0114/sqrt(3.0);
  286. iterSwitchEqpmt->second->m_EqpmtPowerValue.P = m_PQNodes[n].ConsumePowerR * Sac/1000;
  287. iterSwitchEqpmt->second->m_EqpmtPowerValue.Q = m_PQNodes[n].ConsumePowerX * Sac/1000;
  288. iterSwitchEqpmt->second->m_EqpmtPowerValue.S = sqrt(m_PQNodes[n].ConsumePowerR*m_PQNodes[n].ConsumePowerR + m_PQNodes[n].ConsumePowerX*m_PQNodes[n].ConsumePowerX) * Sac/1000;
  289. iterSwitchEqpmt->second->m_EqpmtPowerValue.PF = iterSwitchEqpmt->second->m_EqpmtPowerValue.P/iterSwitchEqpmt->second->m_EqpmtPowerValue.S;
  290. }
  291. }
  292. //(3)若为35kV整流变馈线
  293. else if (iterLine->second->GetCateGory()==Eqpmt_Category_Powerline_Transformer_35ToDC)
  294. {
  295. if (m_PQNodes[n].Category==PowerNode_PQD_Category)
  296. {
  297. DCSTATIONMAP::iterator iter1 = m_PowerStationNodeMap.begin();
  298. for (;iter1!=m_PowerStationNodeMap.end();iter1++)
  299. {
  300. Dc_PowerStation& powerstation = iter1->second;
  301. for (int k=0;k<All_Power_Station_Nums;k++)
  302. {
  303. if (p_PQValueArr[k].StationID==powerstation.GetID())
  304. {
  305. //馈线电流=2台整流机组有功功率/(2*母线节点电压)
  306. double P_QY = p_PQValueArr[k].P_QY/2;
  307. double Q_QY = p_PQValueArr[k].Q_QY/2;
  308. double i_QY = P_QY/(m_PQNodes[n].OutputV * Vac);
  309. iterSwitchEqpmt->second->m_EqpmtPowerValue.I= i_QY;
  310. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ia = i_QY/sqrt(3.0);
  311. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ib = i_QY/sqrt(3.0);
  312. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ic = i_QY/sqrt(3.0);
  313. iterSwitchEqpmt->second->m_EqpmtPowerValue.P = P_QY;
  314. iterSwitchEqpmt->second->m_EqpmtPowerValue.Q = Q_QY;
  315. iterSwitchEqpmt->second->m_EqpmtPowerValue.S = sqrt(P_QY*P_QY+Q_QY*Q_QY);
  316. iterSwitchEqpmt->second->m_EqpmtPowerValue.PF = P_QY/sqrt(P_QY*P_QY+Q_QY*Q_QY);
  317. }
  318. }
  319. }
  320. }
  321. }
  322. //(4)若为母联支路
  323. else if (iterLine->second->GetCateGory()==Eqpmt_Category_Powerline_BusTie)
  324. {
  325. double U = sqrt(E[pLine->GetLlineID()]*E[pLine->GetLlineID()]+F[pLine->GetLlineID()]*F[pLine->GetLlineID()])*Vac;
  326. iterSwitchEqpmt->second->m_EqpmtPowerValue.U = U/1000;
  327. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uab = U/1000;
  328. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ubc = U/1000;
  329. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uca = U/1000;
  330. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ua = U/(sqrt(3.0)*1000);
  331. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ub = U/(sqrt(3.0)*1000);
  332. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uc = U/(sqrt(3.0)*1000);
  333. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uc = U/(sqrt(3.0)*1000);
  334. }
  335. }
  336. }
  337. }
  338. }
  339. else
  340. {
  341. iterSwitchEqpmt->second->m_EqpmtPowerValue.U = 0.0;
  342. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uab = 0.0;
  343. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ubc = 0.0;
  344. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uca = 0.0;
  345. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ua = 0.0;
  346. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ub = 0.0;
  347. iterSwitchEqpmt->second->m_EqpmtPowerValue.Uc = 0.0;
  348. iterSwitchEqpmt->second->m_EqpmtPowerValue.I = 0.0;
  349. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ia = 0.0;
  350. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ib = 0.0;
  351. iterSwitchEqpmt->second->m_EqpmtPowerValue.Ic = 0.0;
  352. iterSwitchEqpmt->second->m_EqpmtPowerValue.P = 0.0;
  353. iterSwitchEqpmt->second->m_EqpmtPowerValue.Q = 0.0;
  354. iterSwitchEqpmt->second->m_EqpmtPowerValue.PF = 0.0;
  355. }
  356. iterSwitchEqpmt->second->m_EqpmtPowerValue.Position = ISCS_DD_EqpmtPosition_Eqpmt;
  357. }
  358. }
  359. }
  360. }
  361. //xyx新增 end
  362. }
  363. m_CritilSecEqpmt.unlock();
  364. }
  365. bool ACSysMG::CreateYKBMatrix() //产生雅可比矩阵,雅可比矩阵的产生方法
  366. {
  367. m_EquationCalcul.Clear();
  368. m_EquationCalcul.SetHangLie(2*m_PQNodes.size()-2,2*m_PQNodes.size()-1);
  369. for (int i=1;i<m_PQNodes.size();i++)
  370. {
  371. for (int j=1;j<m_PQNodes.size();j++)
  372. {
  373. if (i==j)
  374. {
  375. double ai=0; //节点注入电流实部
  376. double bi =0; //节点注入电流的虚部
  377. for (int e=0;e<m_PQNodes.size();e++)
  378. {
  379. ai+=ACNodeMatrix[i][e].R*E[e]-ACNodeMatrix[i][e].X*F[e]; //P26,公式(3-46)
  380. bi+=ACNodeMatrix[i][e].R*F[e]+ACNodeMatrix[i][e].X*E[e];
  381. }
  382. //根据节点电流产生对应的雅可比矩阵
  383. double Hii= ACNodeMatrix[i][i].X*E[i]-bi-ACNodeMatrix[i][i].R*F[i]; //H矩阵,P26,公式(3-45)//E[i],F[i]分别为节点电压实部和虚部
  384. m_EquationCalcul.SetParam((i-1)*2,(i-1)*2,Hii); //给对应矩阵a元素赋值
  385. double Nii= -ai-ACNodeMatrix[i][i].R*E[i]-ACNodeMatrix[i][i].X*F[i]; //N矩阵
  386. m_EquationCalcul.SetParam((i-1)*2,(i-1)*2+1,Nii);
  387. if (m_PQNodes[i].Category==PowerNode_PQ_Category||m_PQNodes[i].Category==PowerNode_PQD_Category||m_PQNodes[i].Category==PowerNode_PQL_Category) //是否采用PQ节点算法
  388. {
  389. double Jii= ACNodeMatrix[i][i].R*E[i]-ai+ACNodeMatrix[i][i].X*F[i];//J矩阵,P26,公式(3-45)
  390. m_EquationCalcul.SetParam((i-1)*2+1,(i-1)*2,Jii);
  391. double Lii= bi+ACNodeMatrix[i][i].X*E[i]-ACNodeMatrix[i][i].R*F[i];//L矩阵,P26,公式(3-45)
  392. m_EquationCalcul.SetParam((i-1)*2+1,(i-1)*2+1,Lii);
  393. }
  394. else if (m_PQNodes[i].Category==PowerNode_PV_Category) //PV节点的判断
  395. {
  396. double Rii=-2*F[i];
  397. m_EquationCalcul.SetParam((i-1)*2+1,(i-1)*2,Rii);
  398. double Sii=-2*E[i];
  399. m_EquationCalcul.SetParam((i-1)*2+1,(i-1)*2+1,Sii);
  400. }
  401. else if (m_PQNodes[i].Category==PowerNode_PH_Category) //PH节点的判断
  402. {
  403. m_EquationCalcul.SetParam((i-1)*2,(i-1)*2,0);
  404. m_EquationCalcul.SetParam((i-1)*2,(i-1)*2+1,0);
  405. m_EquationCalcul.SetParam((i-1)*2+1,(i-1)*2,0);
  406. m_EquationCalcul.SetParam((i-1)*2+1,(i-1)*2+1,0);
  407. }
  408. }
  409. else//i不等于j时,矩阵的产生方法
  410. {
  411. double Hij=ACNodeMatrix[i][j].X*E[i]-ACNodeMatrix[i][j].R*F[i];//H矩阵,P26,公式(3-44)
  412. m_EquationCalcul.SetParam((i-1)*2,(j-1)*2,Hij);
  413. double Nij =-ACNodeMatrix[i][j].R*E[i]-ACNodeMatrix[i][j].X*F[i];//N矩阵,P26,公式(3-44)
  414. m_EquationCalcul.SetParam((i-1)*2,(j-1)*2+1,Nij);
  415. if (m_PQNodes[i].Category==PowerNode_PQ_Category||m_PQNodes[i].Category==PowerNode_PQD_Category||m_PQNodes[i].Category==PowerNode_PQL_Category)
  416. {
  417. m_EquationCalcul.SetParam((i-1)*2+1,(j-1)*2,-Nij);
  418. m_EquationCalcul.SetParam((i-1)*2+1,(j-1)*2+1,Hij);
  419. }
  420. else if (m_PQNodes[i].Category==PowerNode_PV_Category)
  421. {
  422. m_EquationCalcul.SetParam((i-1)*2+1,(j-1)*2,0);
  423. m_EquationCalcul.SetParam((i-1)*2+1,(j-1)*2+1,0);
  424. }
  425. else if (m_PQNodes[i].Category==PowerNode_PH_Category)
  426. {
  427. m_EquationCalcul.SetParam((i-1)*2,(j-1)*2+1,0);
  428. m_EquationCalcul.SetParam((i-1)*2,(j-1)*2,0);
  429. m_EquationCalcul.SetParam((i-1)*2+1,(j-1)*2,0);
  430. m_EquationCalcul.SetParam((i-1)*2+1,(j-1)*2+1,0);
  431. }
  432. }
  433. }
  434. m_EquationCalcul.SetParam((i-1)*2,2*m_PQNodes.size()-2,P[i]);
  435. m_EquationCalcul.SetParam((i-1)*2+1,2*m_PQNodes.size()-2,Q[i]);
  436. }
  437. //TRACE("E0%f,f0%f\n",E[0],F[0]);
  438. //TRACE("E1%f,f1%f\n",E[1],F[1]);
  439. return true;
  440. }
  441. double ACSysMG::CalPiValue(int i)//第i个节点的功率值计算,计算有功功率的值
  442. {
  443. double sume=0;
  444. double sumf=0;
  445. if (i < m_nMaxSigleArrowTrainNums && i < m_PQNodes.size())
  446. {
  447. for (int k=0;k<m_PQNodes.size();k++)
  448. {
  449. sume+=(ACNodeMatrix[i][k].R*E[k]-ACNodeMatrix[i][k].X*F[k]);//Pi值的实部计算,P25,公式(3-41)
  450. sumf+=(ACNodeMatrix[i][k].R*F[k]+ACNodeMatrix[i][k].X*E[k]);//Pi值的虚部计算,P25,公式(3-41)
  451. }
  452. }
  453. double a;
  454. a=E[i]*sume+F[i]*sumf;
  455. return E[i]*sume+F[i]*sumf;
  456. }
  457. void ACSysMG::GetPQIPublishLine(std::vector<POWERVALUE>& PQIList)//获取有功、无功功率,电流的值
  458. {
  459. for(int n=1;n<m_PQNodes.size();n++)
  460. {
  461. for (int e=0;e<m_PQNodes[n].m_SubLines.size();e++)
  462. {
  463. // if (m_PQNodes[n].Category == PowerNode_PQD_Category)
  464. {
  465. POWERVALUE eqpmtupdata;
  466. eqpmtupdata.StationID = m_PQNodes[n].StationID;
  467. eqpmtupdata.InputI= m_PQNodes[n].m_SubLines[e].I;//获取子线节点数据信息
  468. eqpmtupdata.P = m_PQNodes[n].m_SubLines[e].P;
  469. eqpmtupdata.Q = m_PQNodes[n].m_SubLines[e].Q;
  470. eqpmtupdata.EqpmtID=m_PQNodes[n].m_SubLines[e].breakerid;
  471. eqpmtupdata.Parm=m_PQNodes[n].m_SubLines[e].type;
  472. eqpmtupdata.SubLineID=m_PQNodes[n].m_SubLines[e].tranformid;
  473. eqpmtupdata.Position = m_PQNodes[n].Position;
  474. eqpmtupdata.V = m_PQNodes[n].OutputV*Vac;
  475. PQIList.push_back(eqpmtupdata);
  476. }
  477. }
  478. }
  479. }
  480. void ACSysMG::GetMLVPublish(std::vector<POWERVALUE>& PQIList)//获取母线电压
  481. {
  482. for(int n=0;n<m_PQNodes.size();n++)
  483. //for(int n=1;n<m_PQNodes.size();n++)
  484. {
  485. // if (m_PQNodes[n].Category == PowerNode_PQD_Category)
  486. {
  487. POWERVALUE eqpmtupdata;
  488. eqpmtupdata.StationID = m_PQNodes[n].StationID;
  489. eqpmtupdata.MLineID=m_PQNodes[n].BgkID;
  490. eqpmtupdata.V = m_PQNodes[n].OutputV*Vac;
  491. eqpmtupdata.Position = m_PQNodes[n].Position;
  492. PQIList.push_back(eqpmtupdata);
  493. }
  494. }
  495. }
  496. void ACSysMG::GetIPublishLine(std::vector<POWERVALUE>& PQIList) //获取电流
  497. {
  498. for(int n=1;n<m_PQNodes.size();n++)
  499. {
  500. // if (m_PQNodes[n].Category == PowerNode_PQD_Category)
  501. {
  502. POWERVALUE eqpmtupdata;
  503. eqpmtupdata.StationID = m_PQNodes[n].StationID;
  504. eqpmtupdata.MLineID=m_PQNodes[n].BgkID;
  505. eqpmtupdata.InputI = m_PQNodes[n].InputI;
  506. eqpmtupdata.InputLineID = m_PQNodes[n].inputlineid;
  507. eqpmtupdata.OutputI = m_PQNodes[n].OutputI;
  508. eqpmtupdata.OutLineID = m_PQNodes[n].outputlineid;
  509. eqpmtupdata.Parm = m_PQNodes[n].Category;///
  510. eqpmtupdata.Position = m_PQNodes[n].Position;
  511. PQIList.push_back(eqpmtupdata);
  512. }
  513. }
  514. // EnterCriticalSection(&m_CritilSecEqpmt);
  515. // ACSysMG::EqpmtMap::iterator iter = m_EqpmtInfoMap.begin();
  516. // for (;iter!=m_EqpmtInfoMap.end();iter++)
  517. // {
  518. // EqpmtInfo* peqpmt = iter->second;
  519. // if (peqpmt->GetCateGory()==Eqpmt_Category_Powerline)
  520. // {
  521. // PowerLine* pLine = (PowerLine*)iter->second;
  522. // if (pLine->GetBgkLineID()>0)
  523. // {
  524. // POWERVALUE eqpmtupdata;
  525. // eqpmtupdata.I= pLine->GetLineI();
  526. // eqpmtupdata.ID= pLine->GetBgkLineID();
  527. // PQIList.push_back(eqpmtupdata);
  528. // }
  529. // }
  530. // }
  531. // LeaveCriticalSection(&m_CritilSecEqpmt);
  532. }
  533. void ACSysMG::InitData()
  534. {
  535. for (int i=0;i < m_nMaxSigleArrowTrainNums;i++)
  536. {
  537. if (i<m_PQNodes.size())
  538. {
  539. E[i]=m_PQNodes[i].E;
  540. F[i]=m_PQNodes[i].F;
  541. }
  542. P[i]=0;
  543. Q[i]=0;
  544. }
  545. CalNodePowerRate();//计算节点功率
  546. CalStatus=false;
  547. }
  548. bool ACSysMG::RunCalValue() //动态计算相关电力值,在此涉及到交流侧的所有计算
  549. {
  550. InitData();
  551. for (int i=0;i<Max_Cal_Times;i++)
  552. {
  553. CalPQValue(); //计算有功、无功功率
  554. CreateYKBMatrix(); //生成雅可比矩阵
  555. if (CalYKBMatriX()) //雅可比矩阵的计算
  556. {
  557. CalResult(); //计算节点的电压、功率、电流、消耗功率的有功功率的输入输出电流、无功功率的输入输出电流
  558. ELEEQPMTMAP::iterator haha=m_pElectricEqpmtMap->find("{950E7D94-13BA-45B9-9740-BA37DDF86251}");
  559. CalStatus=true;
  560. break;
  561. }
  562. }
  563. return CalStatus;
  564. //return true;
  565. }
  566. double ACSysMG::GetOutV(int i)//获致对应节点的输出电压
  567. {
  568. if (CalStatus&&i>=0&&i<m_PQNodes.size())//CalStatus计算状态标志位
  569. {
  570. return m_PQNodes[i].OutputV;
  571. }
  572. return -1;
  573. }
  574. void ACSysMG::SetYBZ(double i,double z,double y,double s,double v)//设置电力参数(电流,电抗,视载功率,电压)
  575. {
  576. Iac = i;
  577. Zac = z;
  578. Yac = y;
  579. Sac = s;
  580. Vac = v;
  581. }
  582. //
  583. void ACSysMG::CalNodePowerRate() //计算节点功率->根据直流侧的功率来计算交流侧的功率
  584. {
  585. for (int i=1;i<m_PQNodes.size();i++)
  586. {
  587. for (int e=0;e< m_nAllPowerStationNums;e++)
  588. {
  589. if (m_PQNodes[i].StationID==p_PQValueArr[e].StationID&&m_PQNodes[i].Category==PowerNode_PQD_Category)
  590. {//直流节点与交流节点的ID是否相同与交流侧计算方法的判断,根据直流侧的功率来计算交流侧的功率
  591. double a=p_PQValueArr[e].P_QY;
  592. double b=p_PQValueArr[e].Q_QY;
  593. m_PQNodes[i].ConsumePowerR=p_PQValueArr[e].P_QY/Sac;//消耗功率的实部
  594. m_PQNodes[i].ConsumePowerX=p_PQValueArr[e].Q_QY/Sac;//虚部
  595. for (int k = 0;k<m_PQNodes[i].m_SubLines.size();k++)
  596. {
  597. if (m_PQNodes[i].m_SubLines[k].type==1) //输电线路
  598. {
  599. m_PQNodes[i].m_SubLines[k].P=p_PQValueArr[e].P_QY/2;
  600. m_PQNodes[i].m_SubLines[k].Q=p_PQValueArr[e].Q_QY/2;
  601. }
  602. }
  603. // 线程安全的时间获取方式
  604. auto now = std::chrono::system_clock::now();
  605. std::time_t now_time = std::chrono::system_clock::to_time_t(now);
  606. std::tm local_time;
  607. #if defined(_WIN32)
  608. localtime_s(&local_time, &now_time);
  609. #else
  610. localtime_r(&now_time, &local_time);
  611. #endif
  612. int current_hour = local_time.tm_hour;
  613. // 使用当前小时进行累加
  614. p_PQValueArr[e].P_QYSum[current_hour] += p_PQValueArr[e].P_QY / 360000000;//主站有功功率和
  615. p_PQValueArr[e].Q_QYSum[current_hour] += p_PQValueArr[e].Q_QY / 360000000;//主站无功功率和
  616. p_PQValueArr[e].P_HKSum[current_hour] += p_PQValueArr[e].P_HK / 360000000;//副站有功功率和
  617. p_PQValueArr[e].Q_HKSum[current_hour] += p_PQValueArr[e].Q_HK / 360000000;//副站无功功率和
  618. p_PQValueArr[e].P_QY=0;//主站有功功率
  619. p_PQValueArr[e].Q_QY=0;
  620. }
  621. }
  622. }
  623. }
  624. double ACSysMG::CalPQValue() //计算有功、无功功率
  625. {
  626. for (int i=0;i<m_PQNodes.size();i++)
  627. {
  628. double s=CalPiValue(m_PQNodes[i].Index);
  629. P[i]=m_PQNodes[i].Pis-s/*-m_PQNodes[i].ConsumePowerR*/;//P28 (3-41) (3-42),得到有功功率偏差向量
  630. if (m_PQNodes[i].Category==PowerNode_PQ_Category||m_PQNodes[i].Category==PowerNode_PQD_Category||m_PQNodes[i].Category==PowerNode_PQL_Category)//PQ节点方法算无功功率
  631. {
  632. Q[i]=m_PQNodes[i].Qis-CalQiValue(m_PQNodes[i].Index)/*-m_PQNodes[i].ConsumePowerX*/;//P28 (3-41) (3-42),得到无功功率偏差向量
  633. }
  634. else if (m_PQNodes[i].Category==PowerNode_PH_Category)//PH节点方法算有功、无功功率
  635. {
  636. P[i]=0;
  637. Q[i]=0;
  638. E[i]=m_PQNodes[i].E;
  639. F[i]=m_PQNodes[i].F;
  640. }
  641. }
  642. //TRACE("E0%f,f0%f\n",E[0],F[0]);
  643. //TRACE("E1%f,f1%f\n",E[1],F[1]);
  644. return 0;
  645. }
  646. bool ACSysMG::CreatePQNodeMatrix() //生成交流侧PQ节点矩阵 ,交流节点矩阵ACNodeMatrix 的产生方法, //生成节点导纳矩阵 xyx注释
  647. {
  648. for (int k=0;k< m_nMaxSigleArrowTrainNums;k++)
  649. {
  650. for (int j=0;j< m_nMaxSigleArrowTrainNums;j++)
  651. {
  652. //节点导纳矩阵初始化 xyx注释
  653. ACNodeMatrix[k][j].R=0; //交流PQ节点矩阵初始化
  654. ACNodeMatrix[k][j].X=0;
  655. }
  656. }
  657. for (int i=0;i<m_PQNodes.size();i++) //第i个节点
  658. {
  659. if (m_PQNodes[i].ID>=0)
  660. {
  661. for (int j=0;j<m_PQNodes[i].m_Relations.size();j++) //与节点i相关连支路j xyx注释
  662. {
  663. EqpmtMap::iterator iter = m_EqpmtInfoMap.find(m_PQNodes[i].m_Relations[j]); //根据支路数据设置节点导纳 xyx注释
  664. if (iter!=m_EqpmtInfoMap.end())
  665. {
  666. PowerLine* pLine= (PowerLine*)iter->second;
  667. if (pLine->GetStatus()==0)
  668. {
  669. continue;
  670. }
  671. double r = pLine->GetR(); //支路设置r、x、b
  672. double x = pLine->GetX();
  673. double b = pLine->GetB();
  674. int otherindex=-1;
  675. int index =m_PQNodes[i].Index;
  676. if (index==111)
  677. {
  678. int a=0;
  679. }
  680. else if (index==112)
  681. {
  682. int b=0;
  683. }
  684. if (m_PQNodes[i].Index >= 0 && m_PQNodes[i].Index < m_nMaxSigleArrowTrainNums)
  685. {
  686. //当前节点i处于支路ij的末端 xyx注释
  687. if (m_PQNodes[i].Index!=pLine->GetLlineID())
  688. {
  689. if (m_PQNodes[i].Index==pLine->GetRlineID())
  690. {
  691. otherindex=pLine->GetLlineID();
  692. }
  693. }
  694. //当前节点i处于支路ij的首端 xyx注释
  695. else if (m_PQNodes[i].Index!=pLine->GetRlineID())
  696. {
  697. otherindex=pLine->GetRlineID();
  698. }
  699. if (otherindex>=0)
  700. {
  701. if (otherindex >= 0 && otherindex < m_nMaxSigleArrowTrainNums)
  702. {
  703. //if (pLine->GetTransformID()>0)
  704. //{
  705. // EqpmtMap::iterator iter1 = m_EqpmtInfoMap.find(pLine->GetTransformID());
  706. // Transform* ptransform =(Transform* )iter1->second;
  707. // double TransformRate =ptransform->GetRate();
  708. // ACNodeMatrix[m_PQNodes[i].Index][otherindex].R = -r/((r*r+x*x)*TransformRate); //阻抗实部的计算 电阻
  709. // ACNodeMatrix[m_PQNodes[i].Index][otherindex].X = x/((r*r+x*x)*TransformRate); //阻抗虚部的计算 电抗
  710. // if (ptransform->GetHead()==m_PQNodes[i].ID)
  711. // {
  712. // ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].R += r/(r*r+x*x);
  713. // ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].X +=-x/(r*r+x*x)+b/2;
  714. // }
  715. // else
  716. // {
  717. // ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].R += r/((r*r+x*x)*TransformRate*TransformRate);
  718. // ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].X +=-x/((r*r+x*x)*TransformRate*TransformRate)+b/2;
  719. // }
  720. //}
  721. //情形1:若支路为变压器支路 xyx注释
  722. //若两节点i、j间为变压器支路,首端i为1侧,末端j为k侧,阻抗z=r+jx放在1侧
  723. //则节点间(1)互导Yij=Yji= -1/(kz),(2)节点i自导Yii=1/z,(3)节点j自导Yjj=1/(k*k*z)
  724. if (pLine->GetCateGory()==Eqpmt_Category_Powerline_Transformer_35To400)
  725. {
  726. double R=11.4;
  727. double X=63.7;
  728. double K=0.0114;
  729. //ACNodeMatrix[m_PQNodes[i].Index][otherindex].R = -r/((r*r+x*x)*1); //阻抗实部的计算 电阻
  730. //ACNodeMatrix[m_PQNodes[i].Index][otherindex].X = x/((r*r+x*x)*1); //阻抗虚部的计算 电抗
  731. //if (pLine->GetLlineID()==m_PQNodes[i].ID)
  732. //{
  733. // ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].R += r/(r*r+x*x);
  734. // ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].X +=-x/(r*r+x*x)+b/2;
  735. //}
  736. //else
  737. //{
  738. // ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].R += r/((r*r+x*x)*1*1);
  739. // ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].X +=-x/((r*r+x*x)*1*1)+b/2;
  740. //}
  741. //节点间的互导Yij=Yji= -1/(kz)
  742. ACNodeMatrix[m_PQNodes[i].Index][otherindex].R = -R/((R*R+X*X)*K); //阻抗实部的计算 电阻
  743. ACNodeMatrix[m_PQNodes[i].Index][otherindex].X = X/((R*R+X*X)*K); //阻抗虚部的计算 电抗
  744. //情形1-1:若当前节点i处于变压器支路首端i(即变压器1侧),则节点i的自导Yii=1/z
  745. if (pLine->GetLlineID()==m_PQNodes[i].ID)
  746. {
  747. ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].R += R/(R*R+X*X);
  748. ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].X +=-X/(R*R+X*X)+b/2;
  749. }
  750. //情形1-2:若当前节点i处于变压器末端j(即变压器k侧),则节点i的自导Yii=1/(k*k*z)
  751. else
  752. {
  753. ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].R += R/((R*R+X*X)*K*K);
  754. ACNodeMatrix[m_PQNodes[i].Index][m_PQNodes[i].Index].X +=-X/((R*R+X*X)*K*K)+b/2;
  755. }
  756. }
  757. //情形2:若支路为其他类型支路 xyx注释
  758. else
  759. {
  760. //ACNodeMatrix[m_PQNodes[i].Index][otherindex].R = -r/(r*r+x*x);
  761. //ACNodeMatrix[m_PQNodes[i].Index][otherindex].X = x/(r*r+x*x);
  762. ACNodeMatrix[m_PQNodes[i].Index][otherindex].R = -r/(r*r+x*x); //互导Yij
  763. ACNodeMatrix[m_PQNodes[i].Index][otherindex].X = x/(r*r+x*x);
  764. ACNodeMatrix[index][index].R += r/(r*r+x*x); //自导Yii
  765. ACNodeMatrix[index][index].X +=-x/(r*r+x*x)+b/2;
  766. }
  767. }
  768. }
  769. }
  770. }
  771. }
  772. }
  773. }
  774. return true;
  775. }