⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powerflowdlg.cpp

📁 vc编写的电力系统潮流计算程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -