📄 powerflowdlg.cpp
字号:
// powerflowDlg.cpp : implementation file
//
#include "stdafx.h"
#include "powerflow.h"
#include "powerflowDlg.h"
#include "math.h"
#include "iostream.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPowerflowDlg dialog
struct Branch_Type Branch[100];
struct Generator_Type Generator[100];
struct Load_Type Load[100];
struct Yii_Type Yii[100];
struct Yiil_Type Yiil[100];
struct Yij_Type Yij[100];
struct Yijl_Type Yijl[100];
struct U_Type U[200];
struct PVNode_Type PVNode[100];
struct NodalVoltage_Type NodalVoltage[100];
CPowerflowDlg::CPowerflowDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPowerflowDlg::IDD, pParent)
{
for(int i=1;i<=100;i++)
{
NYseq[i]=0;
}
//{{AFX_DATA_INIT(CPowerflowDlg)
m_hz = 50;
m_mva =100;
m_starttime = 0;
m_endtime =20;
m_tolerance = 1e-005;
m_iteration =20;
m_dyntolerance = 1e-005;
m_maxdyn =20;
m_N = 5;
m_Nb = 5;
m_Ng = 0;
m_Nl = 4;
m_Vo = 1;
m_epsilon = 0.00001;
m_Nb1 = 1;
m_Nb2 = 2;
m_ib1 = 1;
m_jb1 = 2;
m_jb2 = 3;
m_Rb1 = 0.04;
m_Xb1 = 0.25;
m_YKb1 = 0.50;
m_Rb2 = 0.1;
m_Xb2 = 0.35;
m_YKb2 = 0;
m_ib3 = 2;
m_jb3 = 3;
m_Rb3 = 0.08;
m_Xb3 = 0.30;
m_YKb3 = 0.50;
m_jb4 = 4;
m_ib4 = -2;
m_Rb4 = 0.0;
m_Xb4 = 0.015;
m_YKb4 = 1.05;
m_ib5 = -3;
m_jb5 = 5;
m_Rb5 = 0.0;
m_Xb5 = 0.03;
m_YKb5 = 1.05;
m_Nb3 = 3;
m_Nb4 = 4;
m_Nb5 = 5;
m_ib2 = 1;
m_pij = 0.0;
m_qij = 0.0;
m_pji = 0.0;
m_qji = 0.0;
m_ig1 = 4;
m_pg1 = 5;
m_qg1 = 0.0;
m_vg1 = -1.05;
m_ig2 = 5;
m_pg2 = 0.0;
m_qg2 = 0.0;
m_vg2 = -1.05;
m_ig3 = 0;
m_pg3 = 0.0;
m_qg3 = 0.0;
m_vg3 = 0.0;
m_il1 = 1;
m_pl1 = -1.6;
m_ql1 = -0.8;
m_vl1 = 1;
m_il2 = 2;
m_pl2 = -2.0;
m_ql2 = -1.0;
m_vl2 = 1;
m_vl3 = 1;
m_ql3 = -1.3;
m_pl3 = -3.7;
m_il3 = 3;
m_i1 = 0;
m_v1 = 0.0;
m_a1 = 0.0;
m_v2 = 0.0;
m_a2 = 0.0;
m_ploss = 0.0;
m_i2 = 0;
m_qloss = 0.0;
m_i3 = 0;
m_v3 = 0.0;
m_a3 = 0.0;
m_i4 = 0;
m_v4 = 0.0;
m_a4 = 0.0;
m_i5 = 0;
m_v5 = 0.0;
m_a5 = 0.0;
m_vmin = 0.0;
m_node = 0;
m_pgo1 = 0.0;
m_qgo1 = 0.0;
m_pgo2 = 0.0;
m_qgo2 = 0.0;
m_pgo3 = 0.0;
m_qgo3 = 0.0;
m_pgo4 = 0.0;
m_qgo4 = 0.0;
m_pgo5 = 0.0;
m_qgo5 = 0.0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CPowerflowDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPowerflowDlg)
DDX_Text(pDX, IDC_EDIT1, m_hz);
DDX_Text(pDX, IDC_EDIT2, m_mva);
DDX_Text(pDX, IDC_EDIT3, m_starttime);
DDX_Text(pDX, IDC_EDIT4, m_endtime);
DDX_Text(pDX, IDC_EDIT5, m_tolerance);
DDX_Text(pDX, IDC_EDIT6, m_iteration);
DDX_Text(pDX, IDC_EDIT10, m_dyntolerance);
DDX_Text(pDX, IDC_EDIT11, m_maxdyn);
DDX_Text(pDX, IDC_EDIT12, m_N);
DDX_Text(pDX, IDC_EDIT13, m_Nb);
DDX_Text(pDX, IDC_EDIT14, m_Ng);
DDX_Text(pDX, IDC_EDIT15, m_Nl);
DDX_Text(pDX, IDC_EDIT16, m_Vo);
DDX_Text(pDX, IDC_EDIT17, m_epsilon);
DDX_Text(pDX, IDC_EDIT8, m_Nb1);
DDX_Text(pDX, IDC_EDIT9, m_Nb2);
DDX_Text(pDX, IDC_EDIT18, m_ib1);
DDX_Text(pDX, IDC_EDIT19, m_jb1);
DDX_Text(pDX, IDC_EDIT24, m_jb2);
DDX_Text(pDX, IDC_EDIT20, m_Rb1);
DDX_Text(pDX, IDC_EDIT21, m_Xb1);
DDX_Text(pDX, IDC_EDIT22, m_YKb1);
DDX_Text(pDX, IDC_EDIT25, m_Rb2);
DDX_Text(pDX, IDC_EDIT26, m_Xb2);
DDX_Text(pDX, IDC_EDIT27, m_YKb2);
DDX_Text(pDX, IDC_EDIT28, m_ib3);
DDX_Text(pDX, IDC_EDIT29, m_jb3);
DDX_Text(pDX, IDC_EDIT30, m_Rb3);
DDX_Text(pDX, IDC_EDIT31, m_Xb3);
DDX_Text(pDX, IDC_EDIT32, m_YKb3);
DDX_Text(pDX, IDC_EDIT34, m_jb4);
DDX_Text(pDX, IDC_EDIT33, m_ib4);
DDX_Text(pDX, IDC_EDIT35, m_Rb4);
DDX_Text(pDX, IDC_EDIT36, m_Xb4);
DDX_Text(pDX, IDC_EDIT37, m_YKb4);
DDX_Text(pDX, IDC_EDIT38, m_ib5);
DDX_Text(pDX, IDC_EDIT39, m_jb5);
DDX_Text(pDX, IDC_EDIT40, m_Rb5);
DDX_Text(pDX, IDC_EDIT41, m_Xb5);
DDX_Text(pDX, IDC_EDIT42, m_YKb5);
DDX_Text(pDX, IDC_EDIT43, m_Nb3);
DDX_Text(pDX, IDC_EDIT44, m_Nb4);
DDX_Text(pDX, IDC_EDIT45, m_Nb5);
DDX_Text(pDX, IDC_EDIT23, m_ib2);
DDX_Text(pDX, IDC_EDIT70, m_pij);
DDX_Text(pDX, IDC_EDIT71, m_qij);
DDX_Text(pDX, IDC_EDIT72, m_pji);
DDX_Text(pDX, IDC_EDIT73, m_qji);
DDX_Text(pDX, IDC_EDIT46, m_ig1);
DDX_Text(pDX, IDC_EDIT47, m_pg1);
DDX_Text(pDX, IDC_EDIT48, m_qg1);
DDX_Text(pDX, IDC_EDIT49, m_vg1);
DDX_Text(pDX, IDC_EDIT50, m_ig2);
DDX_Text(pDX, IDC_EDIT51, m_pg2);
DDX_Text(pDX, IDC_EDIT52, m_qg2);
DDX_Text(pDX, IDC_EDIT53, m_vg2);
DDX_Text(pDX, IDC_EDIT54, m_ig3);
DDX_Text(pDX, IDC_EDIT55, m_pg3);
DDX_Text(pDX, IDC_EDIT56, m_qg3);
DDX_Text(pDX, IDC_EDIT57, m_vg3);
DDX_Text(pDX, IDC_EDIT58, m_il1);
DDX_Text(pDX, IDC_EDIT59, m_pl1);
DDX_Text(pDX, IDC_EDIT60, m_ql1);
DDX_Text(pDX, IDC_EDIT61, m_vl1);
DDX_Text(pDX, IDC_EDIT62, m_il2);
DDX_Text(pDX, IDC_EDIT63, m_pl2);
DDX_Text(pDX, IDC_EDIT64, m_ql2);
DDX_Text(pDX, IDC_EDIT65, m_vl2);
DDX_Text(pDX, IDC_EDIT69, m_vl3);
DDX_Text(pDX, IDC_EDIT68, m_ql3);
DDX_Text(pDX, IDC_EDIT67, m_pl3);
DDX_Text(pDX, IDC_EDIT66, m_il3);
DDX_Text(pDX, IDC_EDIT74, m_i1);
DDX_Text(pDX, IDC_EDIT75, m_v1);
DDX_Text(pDX, IDC_EDIT76, m_a1);
DDX_Text(pDX, IDC_EDIT78, m_v2);
DDX_Text(pDX, IDC_EDIT79, m_a2);
DDX_Text(pDX, IDC_EDIT80, m_ploss);
DDX_Text(pDX, IDC_EDIT77, m_i2);
DDX_Text(pDX, IDC_EDIT81, m_qloss);
DDX_Text(pDX, IDC_EDIT82, m_i3);
DDX_Text(pDX, IDC_EDIT83, m_v3);
DDX_Text(pDX, IDC_EDIT84, m_a3);
DDX_Text(pDX, IDC_EDIT85, m_i4);
DDX_Text(pDX, IDC_EDIT86, m_v4);
DDX_Text(pDX, IDC_EDIT87, m_a4);
DDX_Text(pDX, IDC_EDIT88, m_i5);
DDX_Text(pDX, IDC_EDIT89, m_v5);
DDX_Text(pDX, IDC_EDIT90, m_a5);
DDX_Text(pDX, IDC_EDIT7, m_vmin);
DDX_Text(pDX, IDC_EDIT91, m_node);
DDX_Text(pDX, IDC_EDIT92, m_pgo1);
DDX_Text(pDX, IDC_EDIT93, m_qgo1);
DDX_Text(pDX, IDC_EDIT94, m_pgo2);
DDX_Text(pDX, IDC_EDIT95, m_qgo2);
DDX_Text(pDX, IDC_EDIT96, m_pgo3);
DDX_Text(pDX, IDC_EDIT97, m_qgo3);
DDX_Text(pDX, IDC_EDIT98, m_pgo4);
DDX_Text(pDX, IDC_EDIT99, m_qgo4);
DDX_Text(pDX, IDC_EDIT100, m_pgo5);
DDX_Text(pDX, IDC_EDIT101, m_qgo5);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPowerflowDlg, CDialog)
//{{AFX_MSG_MAP(CPowerflowDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_POWERFLOW, OnPowerflow)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPowerflowDlg message handlers
BOOL CPowerflowDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//m_ploss=PLoss;
//UpdateData(FALSE);
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CPowerflowDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CPowerflowDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CPowerflowDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CPowerflowDlg::OnPowerflow()
{
// TODO: Add your control notification handler code here
UpdateData(); //将控件中的数据传给成员变量
Branch[1].i=m_ib1;Branch[2].i=m_ib2;Branch[3].i=m_ib3;Branch[4].i=m_ib4;Branch[5].i=m_ib5;//获取原始数据
Branch[1].j=m_jb1;Branch[2].j=m_jb2;Branch[3].j=m_jb3;Branch[4].j=m_jb4;Branch[5].j=m_jb5;
Branch[1].R=m_Rb1;Branch[2].R=m_Rb2;Branch[3].R=m_Rb3;Branch[4].R=m_Rb4;Branch[5].R=m_Rb5;
Branch[1].X=m_Xb1;Branch[2].X=m_Xb2;Branch[3].X=m_Xb3;Branch[4].X=m_Xb4;Branch[5].X=m_Xb5;
Branch[1].YK=m_YKb1;Branch[2].YK=m_YKb2;Branch[3].YK=m_YKb3;Branch[4].YK=m_YKb4;Branch[5].YK=m_YKb5;
Generator[1].i=m_ig1;Generator[1].P=m_pg1;Generator[1].Q=m_qg1;Generator[1].V=m_vg1;
Generator[2].i=m_ig2;Generator[2].P=m_pg2;Generator[2].Q=m_qg2;Generator[2].V=m_vg2;
Generator[3].i=m_ig3;Generator[3].P=m_pg3;Generator[3].Q=m_qg3;Generator[3].V=m_vg3;
Load[1].i=m_il1;Load[1].P=m_pl1;Load[1].Q=m_ql1;Load[1].V=m_vl1;
Load[2].i=m_il2;Load[2].P=m_pl2;Load[2].Q=m_ql2;Load[2].V=m_vl2;
Load[3].i=m_il3;Load[3].P=m_pl3;Load[3].Q=m_ql3;Load[3].V=m_vl3;
Npv=0; //计算PV节点数目
for(int i=1;i<=m_N;i++)
{
int sum=1;
if(Generator[i].V<0.0)
{
Npv+=sum;
PVNode[i].i=Generator[i].i;
PVNode[i].V=fabs(Generator[i].V);
}
}
CVNodal(); //送电压初值
int kp=1,kq=1; //设定迭代收敛状态标志
for(int K=0;K<=m_iteration;K++)
{
if(kp==1) //进行P-θ迭代
{
CUGndy(); //形成不接地导纳矩阵
flag=1;
CYinzb(); //获取第一因子表FB1
CPQNodal(); //计算节点功率
CMaxError(); //获取功率误差
if(MaxError>=m_epsilon) //判断是否满足收敛条件
CRefVoltage(); //不收敛,进行修正
else
kp=0;
}
if(kq==1) //进行Q-U迭代
{
CGndy(); //形成接地导纳矩阵
flag=2;
CYinzb(); //获取第二因子表FB2
CPQNodal();
CMaxError();
if(MaxError>=m_epsilon)
CRefVoltage();
else
kq=0;
}
if(kp==0&&kq==0) //收敛将退出迭代
break;
}
COutNodalData(); //潮流结果输出,输出节点数据
COutBranchData(); //输出支路数据
UpdateData(FALSE); //将成员变量数据传给控件并显示
}
//不接地导纳矩阵的形成
CPowerflowDlg::CUGndy()
{
double R,X,YK,Zmag2,b_ij;
double Gij,Bij;
int i,j,n;
for(i=1;i<=m_N;i++)
{
Yii[i].G=0.0;
Yii[i].B=0.0;
Yiil[i].G=0.0;
Yiil[i].G=0.0;
NYsum[i]=0;
}
for(n=1;n<=m_Nb;n++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -